直接插入排序(java實現)

直接插入排序,指每次從無序表中取出第一個元素,把它插入到有序表的合適位置,使有序表仍然有序。具體方法是第一趟比較前兩個數,然後把第二個數按大小插入到有序表中; 第二趟把第三個數據與前兩個數從前向後掃描,把第三個數按大小插入到有序表中;依次進行下去,進行了(n-1)趟掃描以後就完成了整個排序過程。它是由兩層嵌套循環組成的,外層循環標識並決定待比較的數值,內層循環爲待比較數值確定其最終位置。直接插入排序是將待比較的數值與它的前一個數值進行比較,所以外層循環是從第二個數值開始的。當前一數值比待比較數值大的情況下繼續循環比較,直到找到比待比較數值小的並將待比較數值置入其後一位置,結束該次循環。

 

 

算法描述

對一個有n個元素的數據序列,排序需要進行n-1趟插入操作:

第1趟插入,將第2個元素插入前面的有序子序列--此時前面只有一個元素,當然是有序的。

第2趟插入,將第3個元素插入前面的有序子序列,前面2個元素是有序的。

第n-1趟插入,將第n個元素插入前面的有序子序列,前面n-1個元素是有序的。

 

 

public class InsertSort {
    public static void insertSort(int[] data) {
        for (int i = 1; i < data.length; i++) {
            // 得到i處的元素值
            int tmp = data[i];
            //判斷元素是否大於前面的有序列
            if (data[i]<data[i-1]) {
                //得到有序列的最後一個元素
                int j=i-1;
                //和前面有序列依次比較
                while (j>=0&&data[j]>tmp) {
                    data[j+1]=data[j];
                    j--;
                }
                //找到了合適的位置
                data[j+1]=tmp;
            }
        }

    }
    public static void main(String[] args) {
        int[] data={8,6,7,1,4,7,6,4,9,8,5};
        print(data);
        insertSort(data);
        print(data);

    }
    public static void print(int[] data) {
        for (int i = 0; i < data.length; i++) {
            System.out.print(data[i] + "\t");
        }
        System.out.println();
    }
}
 

結果爲:

8    6    7    1    4    7    6    4    9    8    5     1    4    4    5    6    6    7    7    8    8    9