相較於歸併排序和堆排序,快速排序是一種高效並且簡單的排序方法。算法
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); }