圖解插入排序--直接插入排序


排序思路:每次將一個待排序的元素與已排序的元素進行逐一比較,直到找到合適的位置按大小插入。

第一趟比較示圖:

算法實現:

    public static void insertsort(int arr[]){                
        for(int i = 1;i < arr.length; i ++){
            if(arr[i] < arr[i-1]){//注意[0,i-1]都是有序的。如果待插入元素比arr[i-1]還大則無需再與[i-1]前面的元素進行比較了,反之則進入if語句
                int temp = arr[i];
                int j;
                for(j = i-1; j >= 0 && arr[j] > temp; j --){                
                        arr[j+1] = arr[j];//把比temp大或相等的元素全部往后移動一個位置            
                }
                arr[j+1] = temp;//把待排序的元素temp插入騰出位置的(j+1)
            }            
        }
        
    }
        
    public static void main(String[] args) {
        int array[] = {4,2,1,5};
        
        System.out.println("排序之前:");
        for(int element : array){
            System.out.print(element+" ");
        }
        
        insertsort(array);
        System.out.println("\n排序之后:");        
        for(int element : array){
            System.out.print(element+" ");
        }
    }
}

 

結果:

排序之前:  
4 2 1 5 
排序之后:
1 2 4 5 

算法分析:1.當元素的初始序列為正序時,僅外循環要進行n-1趟排序且每一趟只進行一次比較,沒有進入if語句不存在元素之間的交換(移動)。此時比較次數(Cmin)和移動次數(Mmin)達到                  最小值。

                 Cmin = n-1    Mmin = 0;

                此時時間復雜度為O(n)。

              2.當元素的初始序列為反序時,每趟排序中待插入的元素都要和[0,i-1]中的i個元素進行比較且要將這i個元素后移(arr[j+1] = arr[j]),i個元素后移移動次數當然也就為i                    了,再加上temp = arr[i]與arr[j+1] = temp的兩次移動,每趟移動的次數為i+2,此時比較次數(Cmin)和移動次數(Mmin)達到最小值。

                 Cmax = 1+2+...+(n-1) = n*(n-1)/2 = O(n2)

                 Mmax = (1+2)+(2+2)+...+(n-1+2) = (n-1)*(n+4)/2 = O(n2)  (i取值范圍1~n-1)

                 此時時間復雜度為O(n2)。

              3.在直接插入排序中只使用了i,j,temp這3個輔助元素,與問題規模無關,所以空間復雜度為O(1).

              4.在整個排序結束后,即使有相同元素它們的相對位置也沒有發生變化,

                  如:5,3,2,3排序過程如下

                     A--3,5,2,3

                     B--2,3,5,3

                     C--2,3,3,5

                   排序結束后兩個元素3的相對位置沒有發生改變,所以直接插入排序是一種穩定排序。

 


免責聲明!

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



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