您的位置:首页 > 其它

算法导论笔记之快速排序

2011-07-26 14:29 218 查看
快速排序:时间复杂度 nlgn

思路:排序分为2部分,分割和排序,分割,即以数组中某个位置为轴,其左边的元素键值均<=a[pivot],右边的元素键值均>=a[pivot];排序,即对分割后的左右两部分分别进行快速排序,使用分治思想,递归实现

int myParticipation(int *a,int p,int r),其中p,r分别为待分割数组的上下边界

此函数返回一个下标pos,下标以左键值小于a[pos],下标以右键值大于a[pos],在函数内实现排序,交换等操作
实现思路1:算法导论中的分割算法(此分割不占用额外空间,交换除外)
将数组分为连续的3部分,第一段为小于a[pos]的部分,第二段为大于a[pos]的部分,第三段为还未处理的部分,分别用i,j,r表示这三段的右边界;分隔开始时,i为0(数组以外),j为1,每次比较a[j]和a[r]的值,若a[j]>=a[r],则j++,即第二段长度加1,第一段长度不变(初始为0);若a[j]<a[r],则i++,即第一段长度加1,第二段长度不变,并交换a[i],a[j],但由于第一段第二段连续存储,第二段整体向右平移,因此j++;
当j==r时,此时数组变为2段(最后一段消失),则交换a[i+1],a[r],并返回i+1,i+1即为轴的下标(i为小于轴的那一段的右边界,因此将i+1段置为轴)

伪代码:
PARTITION(A,p,r)
  1 x ← A[r]
  2 i ← p-1
  3 for j ← p to r-1
  4 do if A[j]≤x
  5 then i ← i+1
  6 exchange A[i]←→A[j]
  7 exchange A[i+1]←→A[r]
  8 return i+1

实现思路2:tony hoare的分割算法(此分割需占用而外空间)
选定a[p]为轴,i,j分别初始化为p+1,r,若a[i]小于轴,i++,直到a[i]>a[p];
若a[j]大于轴,j--,直到a[j]<a[p];交换a[i],a[j];当i>=j时程序结束;j即为返回下标

伪代码:
HOARE-PARTITION(A, p, r)


1 x ← A[p]
2 i ← p - 1
3 j ← r + 1
4 while TRUE
5 do repeat j ← j - 1
6 until A[j] ≤ x
7 repeat i ← i + 1
8 until A[i] ≥ x
9 if i < j
10 then exchange A[i] ? A[j]
11 else return j
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: