插入排序
定义
通常人们整理桥牌的方法是一张一张的来,将每一张牌插入到其他已经有序的牌中的适当位置。在计算机的实现中,为了给要插入的元素腾出空间,我们需要将其余所有元素在插入之前都向右移动一位。这种算法叫做插入排序。
分析
对于随机排列的长度为 N 且主键不重复的数组,平均情况下插入排序需要 ~ N²/4 次比较以及 ~ N²/4 次交换。最坏情况下需要 ~ N²/2 次比较和 ~ N²/2 次交换,最好情况下需要 N-1 次比较和 0 次交换。
代码实现
package com.ttpfx.sorting;
import edu.princeton.cs.algs4.StdIn;
public class Insertion {
public static void sort(Comparable[] a) {
int length = a.length;
for (int i = 1; i < 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 (Comparable item : a) {
System.out.print(item + " ");
}
System.out.println();
}
public static boolean isSorted(Comparable[] a) {
for (int i = 1; i < a.length; i++) {
if (!less(a[i - 1], a[i])) {
return false;
}
}
return true;
}
public static void main(String[] args) {
String[] a = StdIn.readAllStrings();
sort(a);
assert isSorted(a);
show(a);
}
}
浙公网安备 33010602011771号