排序算法之快速排序

Dear 丶 2022-09-25 15:24 288阅读 0赞

同样的先上这张图

Center

下面分析交换排序之快速排序:

快速排序的思想是先选择一个基准元素(一般取第一个元素),然后对剩下的元素作两端遍历,左边找到比基准元素大的元素,右边找到比基准元素小的元素,两者交换,重复下去直到low>high,再把基准元素跟high交换。这样一遍下来,基准元素左边的元素都比基准元素小,基准元素右边的元素都比基准元素大。

然后对基准元素左边和右边分别作快速排序。

快速排序是通常被认为在同数量级(O(nlog2n))的排序方法中平均性能最好的。但若初始序列按关键码有序或基本有序时,快排序反而蜕化为冒泡排序。一般公认的比较好的排序算法是先用快速排序使序列基本有序,当快速排序递归到一定深度后转为堆排序或插入排序,比如内省排序就是先快速后堆。

快速排序最好及平均情况时间复杂度为O(nlogn),最坏情况为O(n2)。

快速排序并不需要额外的空间,空间复杂度为O(1)。

快速排序是不稳定的。

AS代码:

  1. /**
  2. * 快速排序实现函数
  3. * 先一个基准,把小于基准的元素放到左边,大于基准的元素放到右边
  4. * 返回基准
  5. */
  6. private function Partition(arr:Array,first:int,last:int):int{
  7. var temp:Number;
  8. //确定基准元素
  9. var privot:int=arr[first];
  10. var low:int=first+1;
  11. var high:int=last;
  12. while(low<high){
  13. //找到第一个比基准元素小的无素
  14. while(low<=high && arr[high]>=privot){
  15. high--;
  16. }
  17. //找到第一个比基准元素大的元素
  18. while(low<=high && arr[low]<=privot){
  19. low++;
  20. }
  21. if(low<high){
  22. temp=arr[low];
  23. arr[low]=arr[high];
  24. arr[high]=temp;
  25. }
  26. }
  27. //把基准元素交换到中间去
  28. if(privot>arr[high]){
  29. arr[first]=arr[high];
  30. arr[high]=privot;
  31. return high;
  32. }else{
  33. return first;
  34. }
  35. }
  36. /**
  37. * 快速排序
  38. */
  39. private function QuickSort(arr:Array,low:int,high:int):void{
  40. if(low<high){
  41. var privotIndex:int=Partition(arr,low,high);
  42. QuickSort(arr,low,privotIndex-1);
  43. QuickSort(arr,privotIndex+1,high);
  44. }
  45. }

C++代码

  1. /*
  2. * 快速排序
  3. * 确定一个基准元素,把比基准元素小的元素放左边,大的放右边
  4. * 然后再递归对左右两边的元素作快速排序
  5. * 最好和平均O(nlogn),最坏O(n2)
  6. * O(1)
  7. * 不稳定
  8. */
  9. template<typename T>
  10. void SortHelp<T>::quickSort(T l[], int length, int low, int high)
  11. {
  12. if (low < high)
  13. {
  14. int pivot = partition(l, length, low, high);
  15. quickSort(l, length, low, pivot - 1);
  16. quickSort(l, length, pivot + 1, high);
  17. }
  18. }
  19. template<typename T>
  20. int SortHelp<T>::partition(T l[], int length, int low, int high)
  21. {
  22. #ifdef a
  23. //确定基准元素下标
  24. int pivot = low;
  25. low++;
  26. while (low < high)
  27. {
  28. while (low < high && l[high] >= l[pivot])
  29. {
  30. high--;
  31. }
  32. while (low < high && l[low] <= l[pivot])
  33. {
  34. low++;
  35. }
  36. if (low < high)
  37. {
  38. l[low] += l[high];
  39. l[high] = l[low] - l[high];
  40. l[low] = l[low] - l[high];
  41. }
  42. }
  43. if (l[high] < l[pivot])
  44. {
  45. l[pivot] += l[high];
  46. l[high] = l[pivot] - l[high];
  47. l[pivot] = l[pivot] - l[high];
  48. pivot = high;
  49. }
  50. return pivot;
  51. #else
  52. int pivot = l[low];
  53. while (low < high)
  54. {
  55. //从后面找大的数往前填补
  56. while (low < high && l[high] >= pivot)
  57. {
  58. high--;
  59. }
  60. if (l[high] < pivot)
  61. {
  62. l[low++] = l[high];
  63. }
  64. //从前面找小的数往后填补
  65. while (low < high && l[low] <= pivot)
  66. {
  67. low++;
  68. }
  69. if (l[low] > pivot)
  70. {
  71. l[high--] = l[low];
  72. }
  73. }
  74. //填补最后一个元素并返回
  75. l[high] = pivot;
  76. return high;
  77. #endif // 0
  78. }

总结,快速排序的时间复杂度为O(nlogn),最坏情况下为O(n2),空间复杂度为O(1),不稳定。

发表评论

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

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

相关阅读

    相关 排序算法快速排序

    快速排序是一种基于分治思想的排序算法。它的基本思想是通过一趟排序将待排数据分割成独立的两部分,其中一部分的所有元素都比另一部分的所有元素小,然后再分别对这两部分继续进行排序,重

    相关 排序算法快速排序

    \[交换排序-快速排序\] 1.算法思想: 选择一个元素作为基准,先从右向左遍历数组寻找比基准小的数a,然后从左向右寻找比基准大的数b,交换a和b的值,当左右会面

    相关 排序算法快速排序

    > 快速排序。 > 从数组中取出一个基准数,遍历数组中的每个元素,与基准数比较大小,将小于基准数的元素放在其左侧,大于基准数的元素放在其右侧, >

    相关 排序算法快速排序

    同样的先上这张图  ![Center][] 下面分析交换排序之快速排序: 快速排序的思想是先选择一个基准元素(一般取第一个元素),然后对剩下的元素作两端遍历,左边找

    相关 排序算法快速排序

    快速排序的基本思想是:通过一趟排序将要排序的[数据分割][Link 1]成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行

    相关 排序算法快速排序

    快速排序是冒泡排序的改进版,也是最好的一种内排序,也是作为程序员必须掌握的一种排序方法。 快速排序的基本思想是 > 1、先从数列中取出一个数作为基准数 > 2、分区过程,

    相关 排序算法快速排序

    快速排序是一种高效的排序算法,它采用分而治之的思想,把大的拆分成小的,小的再拆分为更小的。 其原理是:对于给定的数组,通过一趟排序之后,将原序列分为两部分,其中前一部分的所