编程珠玑总结—column 11 Sorting

Technorati 标签: 算法, 笔记

插入排序:

   1: for i = [1,n)
   2:     for (j = i; j>0 && x[j-1]>x[j]; j--)
   3:         swap(j-1, j)

可以进一步优化上面的算法(代码调整):

   1: for i = [1, n)
   2:     t = x[i]
   3:     for (j=i; j>0 && x[j-1]>x[j]; j--)
   4:         x[j] = x[j-1];
   5:     x[j] = t;

 

快速排序:

方法一:(维持循环不变量)

t

 

>=t?
l                                        m i                                                              u

   1: void qsort1(l, u)
   2:     if l>=u 
   3:         return 
   4:     m = l
   5:     for i=[l+1, u]
   6:         /* invariant:x[l+1...m] < x[l] &&
   7:                      x[m+1...u] >= x[l]*/
   8:         if x[i]
   9:             swap(++m, i)
  10:     swap(l, m)
  11:     qsort1(l, m-1)
  12:     qsort1(m+1, u)
  13:             

缺点:考虑到如果输入元素全部相等的情况,上面的算法退化为O(N^2),所以使用下面的算法

方法二(从数组的两端开始扫描):

 
   1: void qsort3(l, u)
   2:     if l>=u  
   3:         return
   4:     t = [l]; i=l; j=u+1;
   5:     loop:
   6:         do i++ while i<=u && x[i]
   7:         do j-- while x[j]>t;
   8:         if i>j
   9:             break;
  10:         swap(i, j)
  11:     swap(l, j)
  12:     qsort3(l, j-1)
  13:     qsort3(j+1, u)

优化,考虑到小数组的情况下,插入排序效率更高,结合qsort3与isort3得到qsort4

   1: void qsort4(l, u)
   2:     if l-u <= cutoff
   3:         return ;
   4:     t = x[l]; i=l; j=u+1;
   5:     loop:
   6:         do i++; while i<=u && x[i]
   7:         do j--; while x[i]>t;
   8:         if i>j
   9:             break;
  10:         temp = x[i]; x[i] = x[j]; x[j]=temp;
  11:     swap(l, j)
  12:     qsort4(l, j-1)
  13:     qsort4(j+1, u)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值