快速排序的思想是通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。
直接看代码:
void QuickSort(Sqlist *L)
{
QSort(L,1,L->length);
}
因为用到递归,所以把函数封装了了一下。
来看QSort()函数:
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); //对高子表递归排序
}
}
Partition()函数要做的就是在序列中选区一个关键字,经过函数运行之后让他的左边的数都比他小,右边的数都比他大。
来看Partition()函数:
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; //返回枢轴所在的位置
}
复杂度分析:
时间复杂度:O(nlogn)
空间复杂度:O(logn)