sort

插入排序

insertion-sort(A)
for i = 2 to A.length
j = i-1
while(j>0 & A[j]>A[i])
exchangeA[j+1],A[j]
j–
A[j+1] = A[i]

归并排序

归并算法是典型的分治(递归)方法
分治的思想:
将原问题分解为几个规模较小但类似于原问题的子问题,递归求解这些子问题,然后再合并这些子问题的解答来建立原问题的解

伪代码
merge-sort(A,p,r)
if(p

习题2.3.5对已经排序号的序列A 使用二分查找法

binary-search(A,p,q,v)
if(p==q)
if v == A[p]
return p
else
return null
k = (p-q+1)/2向下取整
if(v > A[k])
binary-search(A,k+1,q,v])
else
binary-search(A,p,k,v)

不知道伪代码写的对不对 跟答案不一样
二分查找最坏情况运行时间 Θ(lgn)

习题2.3.6 用二分查找优化插入排序 优化后最坏情况运行时间 Θ(nlgn)

思考题 在归并排序中对小数组使用插入排序

插入排序在n较小时,实际运行速度可能快于归并排序
在归并排序中,当子问题足够小时,用插入排序来使递归的叶变粗 是一种有效的优化
e.g. 对于n/ lgn 长度的子序列用插排

思考题 冒泡排序

bubble-sort(A)
for i = 1 to A.length-1
for j = A.length downto i+1
if A[j]

思考题 归并排序求逆序对

1)
利用归并求逆序是指在对子序列 s1和s2在归并时,
若s1[i]>s2[j](逆序状况),则逆序数加上s1.length-i,因为s1中i后面的数字对于s2[j]都是逆序的。
或者
若s1[i]>s2[j](逆序状况),则逆序数加上j,因为s2中j前面的数字对于s1[i]都是逆序的。
时间复杂度是nlog2n,而空间复杂度2n。
2)还有一种做法是基于冒泡排序,从最后一个元素开始,逐次往上面冒,每当交换发生的时候,逆序对的个数就加1
由于冒泡排序可以通过各种优化来降低时间复杂度,但是最坏情况下冒泡的时间复杂度依然是O(n^2)
3)微软笔试题之求逆序对
微软2010年笔试题
在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序数对。一个排列中逆序的总数就称为这个排列的逆序数。如{2,4,3,1}中,2和1,4和3,4和1,3和1是逆序数对,因此整个数组的逆序数对个数为4,现在给定一数组,要求统计出该数组的逆序数对个数。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值