您的位置:首页 > 编程语言 > Java开发

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

2016-03-31 11:45 267 查看
理解插入排序的时候,一个通俗的形容方式是整理扑克牌。在整理扑克牌的时候,手里握着的牌通常是按照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;
}
}

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

 

 

 

 

插入排序对部分有序的数组很有用处,因为可以跳过对有序的部分的操作。而且通过插入排序还可以改良出一些其他的高级排序算法(比如希尔排序)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息