插入排序

插入排序

一、适用场景

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

二、插入排序思想

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

证明该思想的正确性:

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)所组成的



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值