您的位置:首页 > 其它

分治之快速排序

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)
2.Partition(A,l,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)



注:差消法点这里
 
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: