1、基本思想
首先任意选择一个数据做为划分数组的参照数,将所有比参照数小的数移到它前面,将所有比参照数大的数移到它后面。然后再分别对参照数两边继续进行排序,以达到整个序列有效。
1)以第一个数组元素作为参照数、以left、right分别做为数组第一个数和最后一个数的标记。
2)从right位置开始向前找,找到第一个小于参照数的数,然后将此数赋给left位置。
3)从left位置开始向后找,找到第一个大于参照数的数,然后将此数赋给right位置。
4)重复2)、3)步骤,直到left=right。
5)按照1)、2)、3)、4)步骤不断缩小left、right值进行进行排序,直至left>=right排序结束。
2、在所有同数量级O(nlogn)的排序方法中,快速排序是性能最好的一种方法,在待排序列无序时最好。
3、快速排序是一种不稳定的排序。
最坏时间复杂度是O(n^2),最好时间复杂度O(nlogn),平均时间复杂度O(nlogn)。空间复杂度O(nlogn) 。
4、代码
将elem[]数组按递增进行快速排序
void QuickSort(int *elem, int left, int right)
{
//对elem[left,right]快速排序
if(elem == NULL || (left >= right))
{
return;
}
int referenceElem = elem[left];//划分数组的参照数
int pos = left;//记录排序后参照数的位置
int i = right;//i标记从right位置向前搜索的位置
int j = left;//j标记从left位置向后搜索的位置
while(i > j)
{
//从i位置开始向前搜索,找到第一个小于参照数的数,然后将此数赋给j位置
for(; i > j; i--)
{
if(elem[i] < referenceElem)
{
elem[j] = elem[i];
j++;
pos = i;
break;
}
}
//从j位置开始向后搜索,找到第一个大于参照数的数,然后将此数赋给i位置
for(; j < i; j++)
{
if(elem[j] > referenceElem)
{
elem[i] = elem[j];
i--;
pos = j;
break;
}
}
}
elem[pos] = referenceElem;
QuickSort(elem, left, pos-1);
QuickSort(elem, pos+1, right);
}