天天看點

資料結構: 排序(插入排序)代碼

i# 算法思想

  • 算法思想: 就好比我們抓紙牌,每次新抓入一張紙牌,從右到左尋找它的位置。
  • 第一次 看第一個元素,顯然左邊沒有比他更小的元素了,是以它目前的位置就是0
  • 第二次 看第二個元素,和第一個元素比較,如果它小于第一個元素,則它的位置放到第一個元素的位置,否則就在原位置
  • 第三次 在這時,其實講過前兩次的排序i=0, i=1上的兩個元素已經是有序的了。那麼第三個元素首先和第二個元素相比較,如果它小于第二個元素則和第二個元素進行交換;然後再和第一個元素比較,如果小于第一個元素則繼續和第一個元素交換。
  • 第i次排序,此時第0個元素和第i-1個元素已經是有序的了。是以第i個元素一次從第i-1到0去比較直到找到自己合适的位置。
  • 直到第n次

代碼

package sort;

/**
 * 插入排序
 * 算法思想: 就好比我們抓紙牌,每次新抓入一張紙牌,從右到左尋找它的位置。
 * 第一次 看第一個元素,顯然左邊沒有比他更小的元素了,是以它目前的位置就是0
 * 第二次 看第二個元素,和第一個元素比較,如果它小于第一個元素,則它的位置放到第一個元素的位置,否則就在原位置
 * 第三次 在這時,其實講過前兩次的排序i=0, i=1上的兩個元素已經是有序的了。那麼第三個元素首先和第二個元素相比較,如果它小于第二個元素則和的個元素進行交換
 * 然後再和第一個元素比較,如果小于第一個元素則繼續和第一個元素交換。
 * 第i次排序,此時第0個元素和第i-1個元素已經是有序的了。是以第i個元素一次從第i-1到0去比較直到找到自己合适的位置。
 * 直到第n次
 */

public class InsertSort {
    public static void main(String[] args) {
        int[] arr = new int[]{2, 3, 4, 1, 11, 2, 37, 2};
        InsertSort sort = new InsertSort();
        sort.sort(arr);
        sort.show(arr);
    }


    public void sort(int[] a){
        for(int i = 0; i < a.length; i++){
            for (int j = i; j > 0; j--){
                /**
                 * 如果目前元素已經比i上的元素小了,則不再需要繼續比較了,目前的位置就是它需要的位置
                 */
                if (a[j-1] < a[j]){
                    continue;
                }
                swap(j-1, j, a);
            }
        }
    }

    /**
     * 使用移位法
     *
     * @param a
     */
    public void sort2(int[] a) {
        for (int i = 0; i < a.length; i++) {
            int temp = a[i];
            int j = i;
            while (j > 0) {
                if (temp < a[j - 1]) {
                    // 将j-1位置的值指派給j, 相當于j-1位置的元素後移一位
                    a[j] = a[j - 1];
                    j--;
                }else{
                    //如果目前的值,大于j-1位置上的值,則說明該位置就是目前值應該在的位置
                    break;
                }

            }
            //最終j就是temp值應該存在的位置
            a[j] = temp;

        }
    }




    public void swap(int i, int j, int[] arr) {
        int temp = arr[j];
        arr[j] = arr[i];
        arr[i] = temp;
    }


    public void show(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
    }
}

           

繼續閱讀