快速排序
快速排序是一种分治法(divide-and-conquer)算法。特点概述:
- 原址排序(in place) :节省内存;
- 算法时间复杂度低 ;
- 非常实用(very practical) 。
基本思想
Divide:根据轴值(pivot)将数组划分为两个子数组,使得左边子数组中的所有元素值都小于等于,右边子数组的所有值大于等于。
Conquer:通过迭代实现两个子数组的排序;
Conbine:简单拼接
。
代码实现
划分步骤(Partition subroutine)
int Partiton(int Arr[], int p,int q){
int x = Arr[p]; //pivot x
int i = p;
int j,tmp;
for(j=p+1,j<=q,j++){
if (Arr[j]<=x){
i++;
tmp = Arr[j];
Arr[j] = Arr[i];
Arr[i] = tmp;
}
}
Arr[p] = Arr[i];
Arr[i] = x;
return i;
}
快速排序(Quick Sort)
int QuickSort(int Arr[], int p,int q){
if(p<q){
int mid=Partition(Arr,p,q);
QuickSort(Arr,p,mid-1);
QuickSort(Arr,mid+1,q);
}
}
初始调用时,使用QuickSort(Arr,0,n-1)
即可。
随机化快速排序(Randomized QuickSort)
轴值(Pivot)取数组中的某个随机元素,即在开始排序前,将第一个元素与其他元素(其位置由产生的随机数决定)进行交换。随机化快速排序的期望时间复杂度为。
- 运行时间与输入数组不相关;
- 最差情况是由随机数产生器决定的
- 实际应用,通常比合并排序(MergeSort)快3倍以上
void Randomized_Partition(int Arr[],int p,int q){
int i=p+rand()%(q-p+1);
int tmp = Arr[p];
Arr[p] = Arr[i];
Arr[i] = tmp;
return Partition(Arr,p,q);
}