插入排序平均情况下需要N^2 / 4次比较以及N^2 / 4次交换
最坏情况下需要N^2 / 2次比较以及N^2 / 2次交换
最有情况下需要N - 1次比较以及0次交换
插入排序本质上就是对于1到N - 1 之间的每一个i,将a[i]与a0到a[i-1]中比它小的元素依次有序的进行交换,在交换过程中,它左侧的元素总是保持有序的,当i到达数组右端时,排序就完成了。插入排序的过程中需要进行的交换操作的次数和数组中倒置元素的对数数量相同,所以插入排序所需的实践取决于输入元素中的初始顺序,当数组中倒置元素的对数数量很少时,插入排序有可能就是最快的排序方式。
插入排序的具体代码实现如下:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* Created by ZYQ on 2016/9/20.
*/
public class InsertionSort {
// 将用插入排序对数组a升序排列
public static void inSort(Comparable[] a) {
for (int i = 1; i < a.length; i++) {
for (int j = i; j > 0 && less(a[j], a[j - 1]); j--) {
exch(a, j, j-1);
}
}
}
// 比较两个值的大小
private static boolean less(Comparable v, Comparable w) {
return v.compareTo(w) < 0;
}
// 交换两个元素的位置
private static void exch(Comparable[] a, int i, int j) {
Comparable temp = a[i];
a[i] = a[j];
a[j] = temp;
}
// 在单行中打印数组
private static void show(Comparable[] a) {
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
System.out.println();
}
// 测试数组元素是否有序
public static boolean isSorted(Comparable[] a) {
for (int i = 1; i < a.length; i++) {
if (less(a[i], a[i - 1])) {
return false;
}
}
return true;
}
public static void main(String[] args) throws IOException {
System.out.println("Enter the statements:");
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String input = reader.readLine();
String[] item = input.split(" ");
inSort(item); // 对数组进行插入排序
show(item);
System.out.println("is sorted: " + isSorted(item));
}
}