排序复杂度详解(2)

4.冒泡排序:

      是一种简单的稳定的交换排序,其排序过程为:对于相邻的元素进行大小比较,如果满足排序要求,则不进行交换,否则将两个数进行交换。

      如序列{30, 12, 52, 23, 15, 65, 31, 58, 20,63}:

      以下是第一趟:30跟12比较,30>12交换位置,30<52,不交换位置,以此类推,将序列中最大的数放到最后位置,共执行n - 1次比较。共需要做 n - 1 次起泡。

    最好时间复杂度:o(n);原因:若文件是正序的时候,只需要一趟冒泡,n - 1次比较,移动次数为0就可以完成排序。因此最好的时间复杂度为o(n);

    最坏时间复杂度:o(n^2);原因:若文件是反序的时候,需要n - 1 趟冒泡,每趟比较 n - i 次关键字;比较的最大值为n*(n-1)/2=o(n^2),移动次数最大值为3n(n-1)/2=o(n^2)(注:需要交换的次数为n*(n-1)/2,而每次交换都需要有三条命令:temp = a;a = b;b = temp,这样就要乘以3啦);所以最坏时间复杂度为o(n^2)。

5.快速排序:不稳定排序

     例:{49.38.65.97.76.13.27} 

     首先以49为标准,将序列分为两部分,左边部分比49小..右边部分比49大,这一步如下图:

图来源于:http://www.bsgz.net/Article/Class20/Class88/sjjg/200609/936.html

     最坏时间复杂度:o(n^2);原因:当每次划分选取的基准都是当前无序区中关键字最小(或最大)的记录,那么必须做n - 1次划分,第 i 次划分开始时区间长度为 n - i +1,所需的比较次数为 n - i,故总的比较次数达到最大值 n*(n-1)/2=o(n^2),由于移动次数不大于比较次数,所以最坏时间复杂度为o(n^2)。

     最好时间复杂度:o(nlog2n);原因:当每次划分选取的基准都是中值时,可以用递归树来解释,树的高度 d 与节点数 n 的关系是:

d^2-1 = n;所以递归树高度 d = log2(n+1)=o(log2n) ,而每一层递归子节点中的时间复杂度为 o(n)(注:需要比较的总次数小于 n 次,移动次数比比较次数少);所以通过:每一层递归子节点中的时间复杂度*递归树高度 求出总的时间复杂度:o(nlog2n)

6.归并排序:稳定排序

     将两个或两个以上的有序子表合并成一个新的有序表。

     例:{72.28.51.17.96.62.87.33}

  1. {28.72}{17.51}{62.96}{33.87}
  2. {17.28.51.72}{33.62.87.96}
  3. {17.28.33.51.62.72.87.96}

     最坏时间复杂度:o(nlog2n);

     最好时间复杂度:o(nlog2n);都需要log2n趟二路并归,每趟归并的时间为o(n)所以时间复杂度都为o(nlog2n)。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值