插入排序和归并排序(insertion-sort and merge-sort)

一、插入排序

输入:n个数的一个序列<a_1,a_2,...,a_n>

输出:输入序列的一个排列<a'_1,a'_2,...,a'_n>,满足a'_1<a'_2<...<a'_n

我们把希望进行排序的数叫做key。虽然概念上我们在排序一个序列,但是输入是以n个元素的数组的形式出现的。

插入排序对于少量元素的排序,它是一个有效的算法。
插入排序的工作方式像许多人排序一手扑克牌。开始时,我们左手为空并且桌子上的牌面向下,然后我们每次从桌子上拿走一张牌并将他插入左手中正确的位置。
为了找到一张牌的正确位置,我们从右到左将他与已在手中的每张牌进行比较。拿在左手上的牌总是排序好的,原来这些牌时桌子上牌堆中顶部的牌。

 

对于插入排序,我们将其伪代码过程命名为insertion-sort。
其中的参数是一个数组A[1,…,n],包含长度为n的要排序的一个序列。(A中元素数目为n,用A.length表示)

 

该算法原址排序输入的数:算法在数组A中重排这些数,在任何时候,最多只有其中的常数个数字存储在数组外面。
在过程insertion-sort结束时,输入数组A包含排序好的输出序列。

循环不变式与插入排序的正确性


图表明对A=<5,2,4,6,1,3>该算法如何工作。下标j指正被插入到手中的“当前牌”。
在for循环(循环变量为j)的每次迭代开始,包含元素A[1,…,j-1]的子数组构成了当前排序好的左手中的牌,剩余的子数组A[j+1,…,n]对应于仍在桌子上的牌堆。事实上,元素A[1,..,j-1]就是原来在位置1到j-1的元素,但现在已按序排列。我们把A[1,…,j-1]的这些性质形式地表示为一个循环不变式。

二、归并排序

归并排序算法完全遵循分治模式。

分解:分解待排序的n个元素的序列各成具n/2个元素的两个子序列。

解决:使用归并排序递归地排序两个子序列

合并:合并两个已排序的子序列一产生已排序的答案。

当待排序的序列长度为1时,递归“开始回升”,在这种情况下不要做任何工作,因为长度为1的每个序列都已排好序。

归并排序算法的关键操作时“合并”步骤中两个已排序序列的合并。我们通过调用一个辅助过程merge(A,p,q,r)来完成合并,其中A是一个数组,p,q和r是数组下标,满足p≤q≤r。该过程假设子数组A[p..q]和A[q+1,...,r]都已排好序。它合并这两个子数组形成单一的已排好序的子数组并代替当前的子数组A[p,...,r]

 

未完待续。。。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值