快速排序

来源:互联网 发布:windows 磁贴 编辑:程序博客网 时间:2024/06/03 22:22

快速排序的基本思想是:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。快速排序算法的时间复杂度为O(nlogn)。由于关键字的比较和交换是跳跃进行的,因此,快速排序是一种不稳定的排序方法。

void QuickSort(SqList *L){QSort(L, 1, L->length);}void QSort(SqList *L, int low, int high){int pivot;if (low < high){pivot = Partition(L, low, high);QSort(L, low, pivot - 1);QSort(L, pivot + 1, high);}}int Partition(SqList *L, int low, int high){int pivotkey;pivotkey = L->r[low];while (low <  high){while (low < high && L->r[high] >= pivotkey)high--;swap(L, low, high);while (low < high && L->r[low] <= pivotkey)low++;swap(L, low, high);}return low;}
Partition函数要做的,就是先选取当中的一个关键字,然后想尽办法把它放到一个位置,使得它左边的值都比它小,右边的值比它大,我们将这样的关键字称为枢轴

快速排序的优化:
1、优化选取枢轴

三数取中法:即取三个关键字先进行排序,将中间数作为枢轴,一般是取左端、右端和中间三个数。

//优化选取枢轴int pivotkey;int m = low + (high - low) / 2;if (L->r[low] > L->r[high])swap(L, low, high);if (L->r[m] > L->r[high])swap(L, m, high);if (L->r[m] > L->r[low])swap(L, m, low);pivotkey = L->r[low];
2、优化不必要的交换

//优化不必要的交换int Partition1(SqList *L, int low, int high){int pivotkey;pivotkey = L->r[low];L->r[0] = pivotkey;while (low <  high){while (low < high && L->r[high] >= pivotkey)high--;L->r[low] = L->r[high];while (low < high && L->r[low] <= pivotkey)low++;L->r[high] = L->r[low];}L->r[low] = L->r[0];return low;}

3、优化小数组时的方案

如果数组非常小,其实快速排序反而不如直接插入排序来得更好。增加一个判断,当high-low不大于某个常数时(有资料认为7比较合适),就用直接插入排序。

#define MAX_LENGTH_INSERT_SORT 7void QSort(SqList *L, int low, int high){int pivot;if ((high - low) > MAX_LENGTH_INSERT_SORT){pivot = Partition(L, low, high);QSort(L, low, pivot - 1);QSort(L, pivot + 1, high);}elseInsertSort(L);}
4、优化递归操作

//优化递归操作void QSort1(SqList *L, int low, int high){int pivot;if ((high - low) > MAX_LENGTH_INSERT_SORT){while (low < high){pivot = Partition1(L, low, high);QSort1(L, low, pivot - 1);low = pivot + 1;}}elseInsertSort(L); }


0 0