排序算法c语言描述---快速排序

来源:互联网 发布:php 取第一个数组 编辑:程序博客网 时间:2024/05/08 20:56

排序算法系列学习,主要描述冒泡排序,选择排序,直接插入排序,希尔排序,堆排序,归并排序,快速排序等排序进行分析。

文章规划:

一。通过自己对排序算法本身的理解,对每个方法写个小测试程序。 具体思路分析不展开描述。

二。通过《大话数据结构》一书的截图,详细分析该算法 。

 在此,推荐下程杰老师的《大话数据结构》一书,当然不是打广告,只是以一名读者的身份来客观的看待这本书,确实是通俗易懂,值得一看。

ps:一个较为详细的学习链接 http://blog.csdn.net/MoreWindows/article/category/859207


七。快速排序

一。个人理解

快速排序是对冒泡排序的一种改进。是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。
(1) 分治法的基本思想
     分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。
(2)快速排序的基本思想
通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按次方法对这两部分数据分别进行快速排序(再次分割成独立两部分),整个排序过程可以递归进行,直到每个部分只有一个数据为止,以此达到整个数据变成有序序列。
简单来说,可以分成以下三个过程:

1.先从数列中取出一个数作为基准数。

2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。

3.再对左右区间重复第二步,直到各区间只有一个数。

思路也比较简单,下面写了个测试程序,可以对照着理解下。
如果还有什么不懂的,可以看下第二部分,《大话数据结构》书中相关截图,挺详细的。

#include<stdio.h>#define Max_ 10// 打印结果void Show(int  arr[], int n){    int i;    for ( i=0; i<n; i++ )        printf("%d  ", arr[i]);    printf("\n");}// 交换数组元素位置void Swap( int *num_a, int *num_b ){    int temp = *num_b;    *num_b = *num_a;    *num_a = temp;}// 对一个给定范围的子序列选定一个枢纽元素,执行完函数之后返回分割元素所在的位置,// 在分割元素之前的元素都小于枢纽元素,在它后面的元素都大于这个元素int Partition(int array[], int low, int high){    // 采用子序列的第一个元素为枢纽元素    int pivot = array[low];    while (low < high)    {        // 从后往前在后半部分中寻找第一个小于枢纽元素的元素        while (low < high && array[high] >= pivot)        {            --high;        }        // 将这个比枢纽元素小的元素交换到前半部分        Swap(&array[low], &array[high]);        // 从前往后在前半部分中寻找第一个大于枢纽元素的元素        while (low < high && array[low] <= pivot)        {            ++low;        }        // 将这个比枢纽元素大的元素交换到后半部分        Swap(&array[low], &array[high]);    }    // 返回枢纽元素所在的位置    return low;}// 快速排序void QuickSort(int array[], int low, int high){    if (low < high)    {        int n = Partition(array, low, high);        QuickSort(array, low, n);        QuickSort(array, n + 1, high);    }}int main(){   //测试数据    int arr_test[Max_] = { 8, 4, 2, 3, 5, 1, 6, 9, 0, 7 };    //排序前数组序列    Show( arr_test, Max_ );    QuickSort( arr_test, 0, Max_-1 );    //排序后数组序列    Show( arr_test, Max_ );    return 0;}



二。 《大话数据结构》一书截图分析

注:本文仅为分享知识,绝无商业用途。

如果以该种形式分享知识造成不必要的纠纷,还请第一时间告知。





原创粉丝点击