插入排序思想
最近在考虑重新复习算法知识,就打算从最简单的排序算法开始,在网上看了一些人的算法资料,发现有一个人的在插入排序学习笔记中举的例子特别生动形象,我不能找到更好的例子了,就照搬过来。
他将插入排序比作扑克牌排序。当扑克牌发牌结束后,我们开始一张一张的从桌上拿扑克牌,拿了第一张牌到左手上后,因为左手只有一张牌,因此我们认定左手上的唯一牌为有序。
继续用右手从桌上拿第二张牌,将右手上的牌与左手上的牌从右到左进行比较,若右手的牌小于左手的牌,即将左手的牌向右移一位,将右手的牌插入到原来左手牌的位置,此时左手上已经有两张已经排好序的牌了。
右手继续从桌上拿起第三张牌,继续与左手上的牌从右到左比较大小,右手上的牌比左手右边第一张牌小,将左手右边第一张牌向右移一位,继续比较右手牌和左手右边第二张牌,若右手牌大,结束比较,将右手牌插入到刚刚左手第一张牌左移而空出来的空间。
依次遍历下去,左手上拿的牌永远是有序的,右手上拿的牌永远是需要比较插入的。
插入排序实现
插入排序算法解决的问题是在一个有序数列中插入一个元素,并在插入元素后该数列仍然有序。在实际问题中通常遇到将一个无序数组进行排序。
如何通过插入排序给无序数组进行排序?
首先以数组第二位为分割位,确定分割位左边为有序数组(左手牌),将分割位的数据存放在临时容器中(右手牌),此时因为分割位的取出,数组多出一个空闲位,以便有序数组的后移操作,将临时容器的数据与分割位左边第一个元素开始依次比较,若临时容器数据小,比较元素向左移一位,临时容器继续跟下一个元素比较,直至临时容器数据大于比较元素,将临时容器数据写入上个比较元素的位置,第一轮排序结束。分割位右移一位,继续循环比较排序。
实例代码:
/**
* @Author: 黄文伟
* @description: 插入排序
* @Date:Created in 16:05 2019/5/2
*/
public class InsertSort {
public static void main(String[] args) {
// 定义数组
int[] arr = {1, 33, 12, 32, 23, 3452345, 134134, 1344, 435, 45, 231, 434, 243, 4, 565};
// 临时容器,临时存放需排序的元素
int target;
// 遍历无序数组的所有元素
for (int i = 1; i < arr.length; i++) {
// 将无序数组的元素依次放入target
target = arr[i];
// 设定需排序元素左边数组为有序数组
int j = i-1;
/**
* 从需排序元素的左边第一个元素开始从左向右遍历比较有序数组元素和target的大小,若有序数组元素比target大,
* 将有序数组的元素往后移一位,到target大于数组的元素时
*/
while (j > 0 && arr[j] > target) {
arr[j+1] = arr[j];
j--;
}
// 将target数据插入到因为后移而空闲的数组空间
arr[j+1] = target;
}
for (int temp :
arr) {
System.out.print(temp+ "\t");
}
}
}