分治之快速排序
2018-03-25 23:33
141 查看
一、 伪代码
1.QuickSort(A,l,h)输入:数组A[l,h] 输出:排序后的数组A if l<h then p<-Partition(A,l,h) A[l]<->A[p] QuickSort(A,l,p-1) QuickSort(A,p+1,h) |
输入:数组A[l,h] 输出:A的首元素在排好序的数组中的位置 p<-A[l] i<-l+1 j<-r while true do while i<=j and A[j]>=p do j— if i>j then break while i<=j and A[i]<=p do i++ if i>j then break A[i]<->A[j] return j |
二、 C/C++代码
/*********************************************************Function:swap
Description:交换a,b两个变量的值
**********************************************************/
void swap(int & a,int & b){
int tmp = a;
a = b;
b = tmp;
}
/*********************************************************
Function:Partition
Description:找出数组A的首元素在排好序的数组中的位置,
并保证该位置的左边小于等于首元素,右边大于等于首元素
Input:数组A[l,h]
Output:数组A的首元素在排好序的数组中的位置
*********************************************************/
int Partition(int A[],int l,int h){
int p = A[l];
int i = l+1;
int j = h;
while(true){
/*
A[j]>=p及A[i]<=p之所以有等号,这样可以保证两边不会出现相等元素交换。
第一个i<=j的意义在于当i主动移动到j的位置,即等号成立时,j应该再移动
一个位置才可以。对于第二个i<=j的意义则在于当j主动移动到i的位置时,i
再移动一个位置来触发break;
*/
while(i<=j&&A[j]>=p)j--;
if(i>j)break;
while(i<=j&&A[i]<=p)i++;
if(i>j)break;
swap(A[i],A[j]);
}
return j;
}
/**********************************************************
Function:QuickSort
Description:对数组A[l,h]进行快速排序
Input:数组A及其边界l,h
Output:有序数组A
***********************************************************/
void QuickSort(int A[],int l,int h){
if(l<h){
int p = Partition(A,l,h);
swap(A[p],A[l]);
QuickSort(A,l,p-1);
QuickSort(A,p+1,h);
}
}
三、 时间复杂度
1. 最坏情况2. 最好情况
3. 平均情况
划分情况1:T(1)+T(n-1)
划分情况2:T(2)+T(n-2)
…
划分情况n-2:T(n-2)+T(2)
划分情况n-1:T(n-1)+T(1)
注:差消法点这里