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

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

文章规划:

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

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

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

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


七。快速排序

一。个人理解

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

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

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

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

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

[cpp]  view plain copy
  1. #include<stdio.h>  
  2.   
  3. #define Max_ 10  
  4.   
  5. // 打印结果  
  6. void Show(int  arr[], int n)  
  7. {  
  8.     int i;  
  9.     for ( i=0; i<n; i++ )  
  10.         printf("%d  ", arr[i]);  
  11.     printf("\n");  
  12. }  
  13.   
  14. // 交换数组元素位置  
  15. void Swap( int *num_a, int *num_b )  
  16. {  
  17.     int temp = *num_b;  
  18.     *num_b = *num_a;  
  19.     *num_a = temp;  
  20. }  
  21.   
  22. // 对一个给定范围的子序列选定一个枢纽元素,执行完函数之后返回分割元素所在的位置,  
  23. // 在分割元素之前的元素都小于枢纽元素,在它后面的元素都大于这个元素  
  24. int Partition(int array[], int low, int high)  
  25. {  
  26.     // 采用子序列的第一个元素为枢纽元素  
  27.     int pivot = array[low];  
  28.     while (low < high)  
  29.     {  
  30.         // 从后往前在后半部分中寻找第一个小于枢纽元素的元素  
  31.         while (low < high && array[high] >= pivot)  
  32.         {  
  33.             --high;  
  34.         }  
  35.         // 将这个比枢纽元素小的元素交换到前半部分  
  36.         Swap(&array[low], &array[high]);  
  37.         // 从前往后在前半部分中寻找第一个大于枢纽元素的元素  
  38.         while (low < high && array[low] <= pivot)  
  39.         {  
  40.             ++low;  
  41.         }  
  42.         // 将这个比枢纽元素大的元素交换到后半部分  
  43.         Swap(&array[low], &array[high]);  
  44.     }  
  45.     // 返回枢纽元素所在的位置  
  46.     return low;  
  47. }  
  48.   
  49. // 快速排序  
  50. void QuickSort(int array[], int low, int high)  
  51. {  
  52.     if (low < high)  
  53.     {  
  54.         int n = Partition(array, low, high);  
  55.         QuickSort(array, low, n);  
  56.         QuickSort(array, n + 1, high);  
  57.     }  
  58. }  
  59.   
  60. int main()  
  61. {   //测试数据  
  62.     int arr_test[Max_] = { 8, 4, 2, 3, 5, 1, 6, 9, 0, 7 };  
  63.     //排序前数组序列  
  64.     Show( arr_test, Max_ );  
  65.     QuickSort( arr_test, 0, Max_-1 );  
  66.     //排序后数组序列  
  67.     Show( arr_test, Max_ );  
  68.     return 0;  
  69. }  



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

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

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




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值