基本思想
将数组中的所有元素依次和前面的已经排好序的元素相比较(依次),如果选择的元素比已排序的元素小,则交换,直到全部元素都比较过。
直接放菜
package com.lingaolu;
/**
* @author 林高禄
* @create 2020-05-08-16:28
*/
public class InsertSort {
public static void main(String[] args) {
int[] arr = {5, 2, 8, 99, 4, 77, 83, 22, 45, 25, 47, 64, 1};
System.out.print("排序前数组:");
println(arr);
int arrNum = insertSort(arr);
System.out.print("排序后数组:");
println(arr);
System.out.println("插入排序的比较次数是:" + arrNum);
int[] arr2 = {1, 2, 3, 4, 5, 6, 7, 9, 8};
System.out.print("排序前数组:");
println(arr2);
int arr2Num = insertSort(arr2);
System.out.print("排序后数组:");
println(arr2);
System.out.println("插入排序的比较次数是:" + arr2Num);
}
// 插入排序
public static int insertSort(int[] arr) {
if (null == arr) {
return 0;
}
int length = arr.length;
int num = 0;
for (int i = 1; i < length; ++i) {
//单趟排序
int end = i - 1;
int tmp = arr[i];
//循环继续条件
while (end >= 0) {
num++;
if (arr[end] > tmp) {
arr[end + 1] = arr[end];
--end;
} else {
break;
}
}
arr[end + 1] = tmp;
}
return num;
}
public static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
public static void println(int[] arr) {
if (null == arr) {
System.out.println("数组为空");
return;
}
int length = arr.length;
StringBuffer s = new StringBuffer();
s.append("[");
for (int i = 0; i < length; i++) {
if (i == 0) {
s.append(arr[i]);
} else {
s.append(",").append(arr[i]);
}
}
s.append("]");
System.out.println(s);
}
}
结果
排序前数组:[5,2,8,99,4,77,83,22,45,25,47,64,1]
排序后数组:[1,2,4,5,8,22,25,45,47,64,77,83,99]
插入排序的比较次数是:44
排序前数组:[1,2,3,4,5,6,7,9,8]
排序后数组:[1,2,3,4,5,6,7,8,9]
插入排序的比较次数是:9
同样的数组,与冒泡排序相比 ,可以看出插入排序大的效率比冒泡排序的高。