算法-排序算法-插入排序

理解插入排序的时候,一个通俗的形容方式是整理扑克牌。在整理扑克牌的时候,手里握着的牌通常是按照A2345~JQK的有序顺序排列好的,然后每次你抽到一张新的扑克牌,就会把它放到牌组里,让插入后的牌组同样有序。

 

因为这个形容方式,有些人会产生一些误解,认为插入排序每次进行排序只需要一步操作,即“将牌插到它应该在的位置”。

 

这种理解是不完全的,因为你没有理解到在你把牌准确的插入到一个位置之前,你实际上是把这张牌和它所经过的多张牌进行了比较。

 

比如你手里新抓到一张9,要插到你左手的牌组里,就会用9跟牌组从右开始比较(反过来也可,按照我的习惯来说)嗯?最右边是K,比九大,接着左移,嗯?下一张是J,还是比9大,继续左移。直到你遇到“嗯?这也是一张9”或者“啊!这张变成8了”,这时候,你才会把右手中的9插入牌组。

 

 

 

下面用严肃一些的词汇来总结插入排序

 

插入排序跟选择排序类似,都是在乱序数列中产生一个有序的子集,然后通过排序的进行,子集逐渐扩大,直到子集与数列长度相同。

 

下面给出插入排序的java实现

public class InsertionSort{
    public static void sort(int[] a){
        int n=a.length;
        for(int i=1;i<n;i++){
            for(int j=i;j>0&&a[j]<a[j-1];j--){
                int temp=a[j];
                a[j]=a[j-1];
                a[j-1]=temp;
            }
        }
    }
}

上面的代码中,每次操作都是交换两个元素,如果将内循环中的交换元素改成将较大元素向右移动,插入排序的速度可以进一步提高。(因为这样减少了一次对数组的操作)

 

下面给出改进版代码

void static sort(int a){
  int temp;
  for (int i = 1; i<=n.length;i++){
    temp = array[i];
    j=i-1;
    for(int j=i-1;j>=0&&a[j]>temp;j--){
        a[j+1]=a[j];
    }
    a[j+1]=temp;
  }
}

可以看到 改进后的代码在每次排序中会把较大的元素向后移动,然后把较小的元素放置到空出的位置上,每次有新元素参加比较,因为此时新元素之前的数组是有序的,所以新元素只要知道自己小于谁,就可以确定自己的位置,而新元素挪出来之后,前面的较大的元素就可以依次向前递进一步。这样比每次都交换两个相邻元素的位置(两次数组操作)更加节省时间。

 

 

 

 

插入排序对部分有序的数组很有用处,因为可以跳过对有序的部分的操作。而且通过插入排序还可以改良出一些其他的高级排序算法(比如希尔排序)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值