三分鍾徹底理解插入排序


1、原理:從整個待排序列中選出一個元素插入到已經有序的子序列中去,得到一個有序的、元素加一的子序列,直到整個序列的待插入元素為0,則整個序列全部有序。

2、思路:

   (1)設置監視哨r[0],將待插入的記錄值賦值給r[0];

  (2)設置開始查找的位置j;

  (3)在數組中搜索,搜索 中將第j個記錄后移,直到r[0].key>=r[j].key為止

  (4)將r[0]插入r[j+1]的位置上。

3、舉例

  (1)待排序數組:[5,3,4,0,6]

  (2)第一趟排序:[5,3,4,0,6]

    將r[0]=5設置為監視哨,將1位置上的數3和監視哨5進行比較,3小於5,將5和3交換。

    排序結果為:[3,5,4,0,6]  此時0-1范圍上的數值大小已經排好了。

  (3)第二趟比較:[3,5,4,0,6]

    將4和5進行比較,4比5小,交換位置,排序結果為:[3,4,5,0,6]

    將4和3進行比較,4比3大,不交換位置。

    排序結果為:[3,4,5,0,6]  此時0-2位置上的數值大小已經排列好了

  (4)第三趟比較:[3,4,5,0,6]

    將0和5做比較,0比5小,交換位置,排序結果為:[3,4,0,5,6]

    將0和4做比較,0比4小,交換位置,排序結果為:[3,0,4,5,6]

    將0和3做比較,0比3小,交換位置,排序結果為:[0,3,4,5,6]

    排序結果為:[0,3,4,5,6],此時0-3位置上的書已經排好序

  (5)第四趟比較:[0,3,4,5,6]

    6比5大,已經全局有序 ,不用進行任何的交換

4.java實現的代碼

import java.util.Scanner;

public class InsertSort {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("請輸入一個數組的大小:");
        int a = sc.nextInt();
        System.out.println("請輸入一個數組:");
        int[] arr = new int[a];
        for (int i=0 ; i<a;i++){
            arr[i]= sc.nextInt();

        }
        //遍歷數組
        for(int k = 0 ; k<arr.length;k++){
            System.out.print("  "+arr[k]);
        }
        System.out.println();
        insertSort(arr);

    }
    public static void insertSort(int[] arr){
        if(arr==null || arr.length<2){
            return;
        }
        for(int i=1; i <arr.length;i++){
            for(int j=i-1;j>=0&&arr[j]>arr[j+1];j--){
                int temp = arr[j];
                arr[j]=arr[j+1];
                arr[j+1]=temp;
            }

        }
        //將數組進行遍歷
        for(int k = 0 ; k<arr.length;k++){
            System.out.print("  "+arr[k]);
        }


    }
}

  算法的最大時間復雜度仍然是O(n^2),如果數據有序,那么插入排序的時間復雜度是O(n),如果數據是無序的,比如說是逆序的,那么時間復雜度就是O(n^2)。當數據狀況不同,一律按照最差的時間復雜度進行估計。

  時間復雜度為一個算法流程中,常數操作數量的指標,常用O來表示


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM