通过图文来理解快速排序的过程

来源:互联网 发布:mysql syntax error 编辑:程序博客网 时间:2024/06/06 09:45

1.快排的基本思想

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

2.快排的三种实现方式

2.1左右指针法


代码实现:

int PartSort(int* a,int left,int right){if (left >= right)return 0;int key = right;while (left < right){while (a[left] <= a[key] && left < right){left++;}while (a[right] >= a[key] && left < right){right--;}swap(a[left], a[right]);}swap(a[left], a[key]);return left;}void QuickSort(int* a, int left, int right){assert(a != NULL);if (left >= right)return;int div = PartSort(a, left, right);QuickSort(a, left, div - 1);QuickSort(a, div + 1, right);}



2.2挖坑法

挖坑法实现与左右指针法类似,首先用一个变量保存key的值,那么key值所在的位置就可以用其他数据填充,也就是所谓的坑,然后从前往后遍历数组,一旦遇到比key值大的时候,停下来,将这个数据填到坑中,那么这个数据以前的位置称为新的坑,下一步找数据比key小的值,找到之后将数据填到坑中。。

实现代码:
int PartSort(int* a, int left, int right){int tmp = a[right];while (left < right){while (a[left] <= tmp&&left < right){left++;}a[right] = a[left];while (a[right] >= tmp&&left < right){right--;}a[left] = a[right];}a[left] = tmp;return left;}void QuickSort(int* a, int left, int right){assert(a != NULL);if (left >= right)return;int div = PartSort(a, left, right);QuickSort(a, left, div - 1);QuickSort(a, div + 1, right);}


2.3前后指针法



int PartSort(int* a, int begin, int end){int cur = begin;int prev = begin - 1;while (cur < end){while (cur < end  && a[cur] > a[end]){cur++;}if (cur < end){prev++;swap(a[cur], a[prev]);cur++;}}prev++;swap(a[prev], a[end]);return prev;}void QuickSort(int* a, int left, int right){assert(a != NULL);if (left >= right)return;int div = PartSort(a, left, right);QuickSort(a, left, div - 1);QuickSort(a, div + 1, right);}


3.快排的时间复杂度分析


正是因为快排最差的情况可能出现时间复杂度为O(N^2)的情况,所以有必要对快排算法进行优化,常见的有三数取中法和减少递归层次的办法解决。

附:
快排的优化链接:点击打开链接





原创粉丝点击