采用递归的方法,对以枢轴为界的两个子序列进行快速排序,直至子序列长度为1。
1、快速排序的关键是枢轴的选取,主要有三种方法:1)选取第一个或最后一个作为枢轴值; 2)采用随机数生成器,生成枢轴值的下标;3)取第一个、最后一个、中间三者的中间值作为枢轴值,当数据量比较大的时候,甚至采取九数取中的方式。
2、快速排序因为要递归,当需要排序的数组量比较小时,使用普通的排序算法效果可能更好,所以排序前可先进行判断,如果子序列长度大于阀值则采用快速排序,否则采用插入排序或选择排序等。
相较于归并排序和堆排序,快速排序是一种高效而且简单的排序方法。
int partion(SqList* list, int low, int high) {//返回枢轴下标 int key = list->data[high];//枢轴值 int fast = low; int slow = low; while (fast < high) { if (list->data[fast] < key) { if (slow != fast) { swap(list->data[fast], list->data[slow]); } fast++; slow++; } else { fast++; } } swap(list->data[slow], list->data[high]); return slow; } void qsort1(SqList* list,int low,int high) { if (low < high) { int index = partion(list,low,high); qsort1(list, low, index - 1);//高低子表都采用递归的方法实现 qsort1(list, index + 1, high); } } #define MAX_LENGTH_INSERT_SORT 7//定义插入排序可以接受的最大数组 void qsort2(SqList* list, int low, int high) { if ((high - low) > MAX_LENGTH_INSERT_SORT) { if (low < high) { int index = partion(list, low, high); qsort2(list, low, index - 1); qsort2(list, index + 1, high); } } else InsertSort2(list); } //只用一次递归,高子表采用迭代的方式,减小了递归的深度。 void qsort3(SqList* list, int low, int high) { if ((high - low) > MAX_LENGTH_INSERT_SORT) { if (low < high) { int index = partion(list, low, high); qsort3(list, low, index - 1); low = index + 1;//高子表不递归,采用迭代 } } else InsertSort2(list);//当然,此处不能直接使用,还需要对InsertSort2作一下修改,改成指定下标的形式 } void QuickSort(SqList* list) { qsort1(list,0,list->length-1); }