插入排序

来源:互联网 发布:三维码生成软件 编辑:程序博客网 时间:2024/03/29 02:47

插入排序

一、适用场景

适用于对少量元素进行排序。

二、插入排序思想

插入排序类似于整理手里的牌,开始手是空的,所有牌都放在桌子上,一张一张插入到手中。手中的牌是有序的,新放一张牌只需在手中为该牌腾出一张牌的位置,以此类推,所有牌将有序放于手中。插入排序亦基于该思想。

证明该思想的正确性:

1、假如A[1..i-1](i 从 2 -> Length[A])  是有序的,则将A[i]插入到arr[1..i]中合适的位置可使A[1..i]有序。

2、i=2时即只有一个元素,显然有序。当i 取Length[A]时则arr[1..Length[A]]有序,即整个数组A有序。

       故插入排序可保证数组有序。

三、插入排序伪代码描述

insertSort(A)    for i <- 2 to Length[A]          do key  <-  A[i]         Δ 从A[i] 插入到A[1..i-1]         j  <-  i-1        while j > 0 and A[j] > key                 do A[j+1]  <-  A[j]                 j    <-   j - 1        A[j+1] = key

四、程序实现(C++/JAVA)

//T 为任意支持 “>” 操作的数据类型void insertSort(T A[],int length)//length为数组(从下标为1开始)元素个数 {         //一个元素是有序的,故从第二个元素开始插入数据         for(int i=2;i<=length;i++)          {              T key = A[i];              //将元素arr[i]插入到arr[1..i-1]               int j = i-1;              //若元素比key大,则向后移动              while(j > 0 && A[j] > key)              {                       A[j+1] = A[j];                       j--;              }             //将key(arr[i])放置于arr前i+1个元素应在的位置             A[j+1] = key;       }}

五、伪代码描述约定

1、书写上的“缩进”表示程序中的分程序结构;

2、while、for、repeat等循环结构和if、else条件结构和pascal相同;

3、符号Δ表示后面部分为注释;

4、变量i,j,key局部于特定过程,不能不加显式声明就是用全局变量;

5、多重复制i <- j <- e 是将表达式e的值赋予i和j;

6、参数按传值方式传递给一个过程。

7、布尔运算符“and”和“or”都具有短路能力。

8、数组元素的取值是有数组名后跟"[下标]"表示。A[j]表示数据A的第j个元素。

9、复合数据一般组织成对象,它们是由属性(attribute)或域(field)所组成的



原创粉丝点击