排序算法之快速排序

来源:互联网 发布:真实恐怖故事知乎 编辑:程序博客网 时间:2024/06/06 04:42

原理:

已升序为例,取一个数为中位数,比这个数小的放到左边,比这个数大的放到右边。

废话不多说了,我们来看一个快速排序的小视频吧(http://baidu.ku6.com/watch/8495694393207415318.html?page=videoMultiNeed)。

举例:

31, 12, 5, 57, 2, 31, 90, 32, 95,76比较31和76,31小于76。
31, 12, 5, 57, 2, 31, 90, 32,95, 76比较31和95,31小于95。
31, 12, 5, 57, 2, 31, 90,32, 95, 76比较31和32,31小于32。
31, 12, 5, 57, 2, 31,90, 32, 95, 76比较31和90,31小于90。
31, 12, 5, 57, 2,31, 90, 32, 95, 76比较31和31,31等于31。
31, 12, 5, 57,2, 31, 90, 32, 95, 76比较31和2,31大于2。31和2进行交换。
2, 12, 5, 57, 31, 31, 90, 32, 95, 76 比较12和31,12小于31。
2, 12, 5, 57, 31, 31, 90, 32, 95, 76 比较5和31,5小于31。
2, 12, 5,57,31, 31, 90, 32, 95, 76比较57和31,57大于31。57与31进行交换。
2, 12, 5,31, 57, 31, 90, 32, 95, 76此时i==j,31就固定了下来。第一次结束。

31左边

2, 12,5, 31, 57, 31, 90, 32, 95, 76比较2和5,2小于5。
2,12, 5, 31, 57, 31, 90, 32, 95, 76比较2和12,2小于12。
2, 12, 5, 31, 57, 31, 90, 32, 95, 76此时i==j,2固定了下来。第二次结束。

2左边没有数据了,看2到31的这块

2,12,5, 31, 57, 31, 90, 32, 95, 76比较12和5,12大于5。12和5进行交换。
2,5,12, 31, 57, 31, 90, 32, 95, 76此时i==j,12固定了下来。第三次结束。

2右边12左边这块
2,5,12, 31, 57, 31, 90, 32, 95, 76此时i==j,5固定了下来。第四次结束。

看31(左边的31)的右面

2,5,12, 31, 57, 31, 90, 32, 95,76比较57和76,57小于76。
2,5,12, 31, 57, 31, 90, 32,95, 76 比较57和95,57小于95。
2,5,12, 31, 57, 31, 90, 32, 95, 76 比较57和32,57大于32。57和32进行交换。
2,5,12, 31, 32, 31, 90, 57, 95, 76 比较31和57,31小于57。
2,5,12, 31, 32, 31, 90, 57, 95, 76 比较90和57,90大于57。90和57进行交换。
2,5,12, 31, 32, 31, 57, 90, 95, 76 此时i==j,57固定了下来。第五次结束。

看左边31到57这个块

2,5,12, 31, 32,31, 57, 90, 95, 76 比较32和31,32大于31。32和31进行交换。
2,5,12, 31, 31, 32, 57, 90, 95, 76 此时i==j,32固定了下来。第六次结束。

左边31到32这个块

2,5,12, 31, 31, 32, 57, 90, 95, 76此时i==j,31固定了下来。第七次结束。

57右边这个块

2,5,12, 31, 31, 32, 57, 90, 95, 76比较90和76,90大于76。90和76进行交换。
2,5,12, 31, 31, 32, 57, 76,95,90比较95和90,95大于90。95和90进行交换。
2,5,12, 31, 31, 32, 57, 76,90,95此时i==j,95固定了下来。第八次结束。

57到95这个块

2,5,12, 31, 31, 32, 57, 76, 90, 95 比较76和90,76小于90。
2,5,12, 31, 31, 32, 57, 76, 90, 95 此时i==j,76固定了下来。第九次结束。

76到95这个块
2,5,12, 31, 31, 32, 57, 76,90, 95此时i==j,90固定了下来。第十次结束。

代码:(优化过后)

void QuickSort(int a[], int low, int high){if (low < high){int left = low, right = high, num = a[low];while (left < right){while (left < right&&num <= a[right]){--right;}if (left < right){a[left++] = a[right];}while (left < right&&a[left] <= num){++left;}if (left < right){a[right--] = a[left];}}a[left] = num;QuickSort(a, low, left - 1);QuickSort(a, left + 1, high);}}


结论:

快速排序是不稳定的排序,受中位数的影响,平均时间复杂度为O(nlog2n)。
0 0