算法导论笔记之快速排序

来源:互联网 发布:说明书印刷排版软件 编辑:程序博客网 时间:2024/05/09 22:29

快速排序:时间复杂度 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

原创粉丝点击