算法-排序算法-插入排序
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;
}
}
}
}
上面的代码中,每次操作都是交换两个元素,如果将内循环中的交换元素改成将较大元素向右移动,插入排序的速度可以进一步提高。(因为这样减少了一次对数组的操作)
下面给出改进版代码
可以看到 改进后的代码在每次排序中会把较大的元素向后移动,然后把较小的元素放置到空出的位置上,每次有新元素参加比较,因为此时新元素之前的数组是有序的,所以新元素只要知道自己小于谁,就可以确定自己的位置,而新元素挪出来之后,前面的较大的元素就可以依次向前递进一步。这样比每次都交换两个相邻元素的位置(两次数组操作)更加节省时间。
插入排序对部分有序的数组很有用处,因为可以跳过对有序的部分的操作。而且通过插入排序还可以改良出一些其他的高级排序算法(比如希尔排序)
因为这个形容方式,有些人会产生一些误解,认为插入排序每次进行排序只需要一步操作,即“将牌插到它应该在的位置”。
这种理解是不完全的,因为你没有理解到在你把牌准确的插入到一个位置之前,你实际上是把这张牌和它所经过的多张牌进行了比较。
比如你手里新抓到一张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; } }
可以看到 改进后的代码在每次排序中会把较大的元素向后移动,然后把较小的元素放置到空出的位置上,每次有新元素参加比较,因为此时新元素之前的数组是有序的,所以新元素只要知道自己小于谁,就可以确定自己的位置,而新元素挪出来之后,前面的较大的元素就可以依次向前递进一步。这样比每次都交换两个相邻元素的位置(两次数组操作)更加节省时间。
插入排序对部分有序的数组很有用处,因为可以跳过对有序的部分的操作。而且通过插入排序还可以改良出一些其他的高级排序算法(比如希尔排序)
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- JavaScript演示排序算法
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序