快速排序是基于交换思想对冒泡排序的一种改进的交换排序方法,称为分区交换排序。快速排序的核心是划分,可以用递归来实现。
该段代码摘自《大话数据结构》:
L->length(序列长度) L(序列) pivot(枢轴值)
由于要用到递归,将排序算法封装起来。
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,hign); //对高子表递归排序
}
}
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);
}
}
以下给出一个比较完整的将数组排成基本有序的过程:
下面是实现基本有序的一个小练习:
Partition函数的功能就是 将序列分区,使其实现基本有序,然后返回枢轴值在序列中的位置。
时间复杂度
1. 快速排序的平均时间复杂度是 O(nlogn)。
2.最坏情况下时间复杂度是O(n^2)。(冒泡)