插入排序——java实现

插入排序的基本思想就是遍历一边列表,将a[i]依次通过a[i-1]、a[i-2]、a[i-3]...依次比较并交换位置的方式插入合适的位置。

for: i from 0~n-1{

  for: j from i~0

    if(a[j] <= a[j-1]) 交换a[j]和a[j-1] break;

}

 1 package 排序;
 2 
 3 import edu.princeton.cs.algs4.In;
 4 import edu.princeton.cs.algs4.StdOut;
 5 
 6 /**
 7  * 插入排序所需额时间取决于输入中元素的初始顺序。
 8  * 例如,对一个很大的且其中的元素已经有序或接近有序的数组进行排序会比对随机顺序的数组或是逆序数组进行排序要快的多
 9  *@author evasean www.cnblogs.com/evasean/
10  *
11  */
12 @SuppressWarnings("rawtypes")
13 public class Insertion插入排序 {
14     public static void sort(Comparable[] a){
15         int n = a.length;
16         for(int i=1 ; i<n; i++){
17             //将a[i]插入到a[i-1]、a[i-2]、a[i-3]...之中
18             for(int j= i; j>0 && less(a[j],a[j-1]);j--)
19                 exch(a,j,j-1);
20         }
21     }
22     @SuppressWarnings("unchecked")
23     private static boolean less(Comparable v, Comparable w){
24         return v.compareTo(w) < 0;
25     }
26     private static void exch(Comparable[] a, int i, int j){
27         Comparable t = a[i];
28         a[i] = a[j];
29         a[j] = t;
30     }
31     private static void show(Comparable[] a){
32         for(int i=0; i<a.length; i++) StdOut.print(a[i] + " ");
33         StdOut.println();
34     }
35     public static boolean isSorted(Comparable[] a){
36         for(int i = 1; i < a.length; i++){
37             if(less(a[i],a[i-1])) return false;
38         }
39         return true;
40     }
41     public static void main(String[] args){
42         String[] a = new In().readAllStrings();
43         sort(a);
44         assert isSorted(a);
45         show(a);
46     }
47 }

 

posted @ 2017-07-25 10:58  evasean  阅读(254)  评论(0编辑  收藏  举报