插入排序
概述
插入排序,一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法 。插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增1的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动 。
插入排序就像排序一手扑克牌。开始时,我们的左手为空 并且桌子上的牌面向下。然后,我们每次从桌子上拿走一张牌并将它插入左手中正确的位置。为了找到一张牌的正确位置,我们从右到左将它与已在手中的每张牌进行比较。拿在左手上的牌总是排序好的。
图源百度百科
实现原理
将一个数组看成两段,前段为排序好的,后段为待排序的数字,将待排序的数字从第一个依次和前段的数字比,插入到合适的位置即完成排序。
首先,在前后分隔线两端(即前段最后一个,和后端第一个)的数字比较,如果后一个小于前一个即交换两者的位置,直到前一个小于后一个停止,即完成插入。
然后,就相当于前段的数字多了一个,而后段的数字少了一个,即前后分隔线后移了一个位置,继续上面的比较过程即可。
实现代码
package sort;
public class InsertSort {
public static void main(String[] args) {
int[] array = new int[80000];
for (int i = 0; i < array.length; i++) {
array[i] = (int)(Math.random()*800000);
}
long startTime=System.currentTimeMillis();
insertSort(array);
long endTime=System.currentTimeMillis();
System.out.println("程序运行时间: "+(endTime - startTime)+"ms");
//这里排序长度80k的数组,我的老机器的用时为两秒多,说明性能强于冒泡排序和选择排序
}
public static int[] insertSort(int[] array){
//i为需要和前面排列好的数字比较的数字的下标,i从1开始,
// 因为第0个数字是不需要排列的,我们视为它是排列好的
//之后每次加1,都是将其和前面排好的每个数字比较,如果比它小 就插入到它前面。
for (int i = 1; i < array.length; i++) {
//这里从i开始,当前一个数字大于后一个时,交换两者的位置,
//循环,直到前一个数字没有大于后一个数字或者到达数组最前端,
//这样即可实现 插入到 排列好的数字 小于 该数字 的后面 的位置
for (int j = i; j > 0 && array[j] < array[j-1]; j--) {
int n = array[j];
array[j] = array[j-1];
array[j-1] = n;
}
}
return array;
}
}