陈斌彬的技术博客

Stay foolish,stay hungry

插入排序算法和归并排序算法(原创)

一、插入排序算法(Insertion-Sort)

     这是一个对少量元素进行排序的有效算法。作用机理好像玩红5,从桌上摸一张牌,并将其插入到左手一把牌中的正确位置。相同点是为了找到这张牌的正确位置,要从左手中已有牌的最右边开始,从右往左依次比较。还有就是拿到的牌,一定要是桌上那副牌最顶上的牌,你要是跳牌,估计会挨骂,嘻嘻。

     参数:数组A[1..n],包括n个待排序的数。

      数组A中的元素个数n用length[A]


 for j ← 2 to length[A]
           do key ← A[j]
               注释:Insert A[j] into the sorted sequence A[1..j-1]
               j ← j-1
               while i>0 and A[i]>key
                   do A[i+1] ← A[i]
                           i ← i-1
               A[i+1] ← key

       A[1..j-1]是左手中已排序好的牌,A[j+1..n]对应桌上的一摞牌。

二、合并排序算法

此算法依照的是分治模式:

分治法(divide-and-conquer)

将原问题划分成n个规模较小而结构域原问题相似的子问题;递归地解决这些子问题,然后再合并其结果,就得到原问题的解。

分治法在每一层的递归上都有三个步骤:

分解:将原问题分解成一系列子问题

解决:递归地解各子问题。

合并:将子问题的结果合并并返回原问题的解。

合并排序的关键步骤在于合并步骤中的合并两个已排序子序列。为做合并,引入一个辅助过程MERGE(A,p,q,r),其中A是数组,p,q,r是下标,满足p≤q<r。该过程假设A[p..q]和A[q+1..r]都已排好序,并将它们合并成一个已排好序的子数组代替当前子数组A[p..r]。

以下是伪代码,其中∞是哨兵,作为每个数组里判断是否为空的标记。

img

合并算法的例图,意在指示合并算法的处理过程。

img