适用场景:
与选择排序不同,插入排序的时间和初始输入的顺序有关,如果数据接近有序,那么它的时间会很快。
算法思想:
和选择排序有着相似的地方,同样分为两部分,在左边这部分是已经有序的元素,右边是无序的,每次从右边拿出一个数据放到左边,找到这个数合适的位置将其插入,且有序的元素集合的长度加一,如往复,将所有的元素都完成排序。
特点:
运行时间和输入有关:
如果输入的数据大体上是有序的,那么它的效率是比较高的。
代码实现:
/* * 排序算法之选择排序 每次选择一个最小的数和当前的未排序的数交换位置,直到最后一个 */ // 一个排序的标准模板: public void sort(double[] a) { for (int i = 0; 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(double a, double a2) { // 如果第一个数小于第二个数就会返回true return a - a2 <= 0; } // 交换数组中的两个数 private void exch(double[] a, int i, int j) { double t = a[i]; a[i] = a[j]; a[j] = t; } // 显示数组 private void show(double[] a) { for (int i = 0; i < a.length; i++) { StdOut.print(a[i] + "\t"); } } // 判断数组是否是有序的 public static boolean isSort(int[] a) { for (int i = 0; i < a.length - 1; i++) { if (a[i] > a[i + 1]) return true; } return false; } }