快速排序(quick sort)

今天药忘吃喽~ 2021-11-29 17:54 446阅读 0赞

快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序n个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。(出自维基百科)

快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。

在这里我采用的是递归调用分区算法把序列划分成两个子序列的方法来实现快排。具体的图例在维基百科里写得非常清楚,一看就明白了。

分区算法

  首先寻找任意一个pivotIndex位置的元素作为基准元素,并把a[pivotIndex]与最后一个元素交换(swap)。借由移动小于a[pivotIndex]的所有元素到子串行的开头,留下所有大于或等于的元素接在他们后面。在这个过程它也为基准元素找寻最后摆放的位置,也就是它回传的值。它暂时地把基准元素移到子串行的结尾,而不会被前述方式影响到。由于算法只使用交换,因此最后的数列与原先的数列拥有一样的元素。要注意的是,一个元素在到达它的最后位置前,可能会被交换很多次。

伪代码如下:

  1. function partition(a, left, right, pivotIndex)
  2. pivotValue := a[pivotIndex]
  3. swap(a[pivotIndex], a[right]) // 把 pivot 移到結尾
  4. storeIndex := left
  5. for i from left to right-1
  6. if a[i] < pivotValue
  7. swap(a[storeIndex], a[i])
  8. storeIndex := storeIndex + 1
  9. swap(a[right], a[storeIndex]) // 把 pivot 移到它最後的地方
  10. return storeIndex

快速排序算法实现其一:

  1. #include <stdio.h>
  2. void swap(int *a, int *b)
  3. {
  4. int tmp;
  5. tmp = *a;
  6. *a = *b;
  7. *b = tmp;
  8. }
  9. int partition(int arr[], int left, int right, int pivotIndex)
  10. {
  11. int i,pivotValue,storeIndex;
  12. pivotValue = arr[pivotIndex];
  13. storeIndex = left;
  14. swap(&arr[right], &arr[pivotIndex]);
  15. for (i = left; i < right; i++)
  16. {
  17. if (arr[i] < pivotValue) //升序
  18. {
  19. swap(&arr[i],&arr[storeIndex]);
  20. storeIndex++;
  21. }
  22. }
  23. swap(&arr[right],&arr[storeIndex]);
  24. return storeIndex;
  25. }
  26. void QuickSort(int arr[], int left, int right)
  27. {
  28. int pivoValue,nRet;
  29. if (left >= right) return;
  30. pivoValue = left + 1;
  31. nRet = partition(arr,left,right,pivoValue);
  32. QuickSort(arr,left,nRet-1);
  33. QuickSort(arr,nRet+1,right);
  34. }
  35. int main()
  36. {
  37. int i,len;
  38. int arr[] = {
  39. 9,7,2,5,10,7,4,3};
  40. len = sizeof(arr)/sizeof(int);
  41. QuickSort(arr,0,len-1);
  42. for (i = 0; i < len; i++)
  43. {
  44. printf("%3d", arr[i]);
  45. }
  46. }
  47. 2013/6/15 22:31

  当然,还有其它的快排的实现方法。July在它的博客里把两种实现写得非常清楚。非常推荐区读一下。

C语言里的快速排序函数:

  1. void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));

base是待排序数组的首地址;nelem是待排序的元素个数,width是待排序元素占空间的大小,fcmp是自己实现的比较函数(注意函数参数的类型),用来控制排序的顺序。

转载于:https://www.cnblogs.com/Jason-Damon/archive/2013/06/15/3138137.html

发表评论

表情:
评论列表 (有 0 条评论,446人围观)

还没有评论,来说两句吧...

相关阅读

    相关 快速排序(Quick Sort)

    一、算法原理 设要排序的数组是A\[0\]……A\[N-1\],首先任意选取一个数据(通常选用数组的第一个数)作为关键 数据,然后将所有比它小的数据放到它前面,所有比它大

    相关 快速排序(Quick Sort)

    快速排序可以理解为:快速排序=挖坑填数+分治算法; 快速排序(Quick Sort)使用分治法(Divide and conquer)策略来把一个序列分为两个子序列,左右两个

    相关 快速排序(Quick-Sort)

    快速排序的主要思想是根据一个基准数(一般是待排序集中第一个元素)将一个待排序集分成左右两部分,其中左半部分数据集比右半部分数据集均要小或大,接下来,对左和右半部分按照相同的方法

    相关 快速排序(quick sort)

    快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序n个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常