快速排序原理:
1.用最左侧元素作“枢轴”,存入“哨所”
2.设low和high指向两端
3.high向左移动,一旦遇到小于枢轴的元素,则将其移动到左侧,放入low指向的位置;
4.low向右移动,一旦遇到大于枢轴的元素,则将其移动到右侧,放入high指向的位置;
high和low从两侧交替向中间移动,直至low=high. 左侧均小于等于枢轴,右侧均大于等于枢轴,将枢轴记录填入重叠位置则完成划分
快速排序链表法的实现:
int Partition (SqList &L,int low, int high ) {
L.r[0] = L.r[low];
while( low < high ) {
while( high > low && L.r[high] >= L.r[0])
--high;
L.r[low] = L.r[high];
while( low < high && L.r[low] <= L.r[0])
++low;
L.r[high] = L.r[low];
}
L.r[low]=L.r[0];
return low; //划分结束后返回枢轴位置
}
void QSort( SqList L, int low, int high){
if( low<high ){
pivotLoc=Partition(L,low,high);
QSort(L, low , pivotLoc-1);//递归
QSort(L, pivotLoc+1, high);//递归
}
else //边界
return;
}
该算法的平均复杂度:O(N*log2N) 最坏时间复杂度:O(N2),
平均空间复杂度:O(log2N),最坏空间复杂度:O(N)
静态数组的算法实现:
int Position(int a[],int low,int high)
{
int t = a[low];
while(low < high)
{
while(low<high && a[high]>=t)
high--;
a[low] = a[high];
while(low<high && a[low]<=t)
low++;
a[high] = a[low];
}
//最终low=high
a[low] = t;
return low;
}
void Quick_Sort(int a[],int low,int high)
{
int pos;
if(low < high)
{
pos = Position(a,low,high);
Quick_Sort(a,low,pos-1); //左边子序列排序
Quick_Sort(a,pos+1,high); //右边子序列排序
}
}
另外需要注意,快速排序算法是不稳定的。