插入排序



  • 實現思路:

    1.從數組的第二個數據開始往前比較,即一開始用第二個數和他前面的一個比較,如果 符合條件(比前面的大或者小,自定義),則讓他們交換位置。

    2.然后再用第三個數和第二個比較,符合則交換,但是此處還得繼續往前比較,比如有 5個數8,15,20,45, 17,17比45小,需要交換,但是17也比20小,也要交換,當不需 要和15交換以后,說明也不需要和15前面的數據比較了,肯定不需要交換,因為前 面的數據都是有序的。

    3.重復步驟二,一直到數據全都排完。

  • 動圖演示:

  • 代碼實現:

    package 排序;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    public class InsertSort {
    	//輸出排序前后的時間,看看大概需要花多久
        public static void main(String[] args){
            SimpleDateFormat startTime = new SimpleDateFormat("yyyy:MM:dd:HH:mm:ss");
            System.out.println("排序開始時間:"+startTime.format(new Date()));
    
            sort();
            
            SimpleDateFormat endTime = new SimpleDateFormat("yyyy:MM:dd:HH:mm:ss");
            System.out.println("排序結束時間:"+endTime.format(new Date()));
    
        }
    
        public static void sort(){
            //測試80萬個數據的排序
            int[] arr = new int[800000];
            for (int index = 0; index < 800000; index++) {
                arr[index] = (int)(Math.random() * 80000);
            }
    
            for (int i = 1; i < arr.length; i++) {
                int j = i;
                while (j > 0){
                    if (arr[j] < arr[j-1]){
                        int temp ;
                        temp = arr[j];
                        arr[j] = arr[j-1];
                        arr[j-1] = temp;
                        //System.out.println(Arrays.toString(arr));
                        j--;
                    }else {
                        break;
                    }
                }
            }
            //System.out.println(Arrays.toString(arr));
        }
    }
    
    
    • 測試結果:

80萬個數據總共耗時:2分零8秒。結果出乎意料。然而在開始寫這個文章之前我已經開始了測試冒泡排序和選擇排序,同樣也是80萬個數據,,,,然鵝,快10分鍾了,還沒結束。。。。估計是沒戲了。


  • 性能分析:

    1.屬於穩定的排序,適合於數據量小,部分數據有序的情況排序。

    2.如果目標是把n個元素的序列升序排列,那么采用插入排序存在最好情況和最壞情況。最好情況就是,序列已經是升序排列了,在這種情況下,需要進行的比較操作需(n-1)次即可。最壞情況就是,序列是降序排列,那么此時需要進行的比較共有n(n-1)/2次。插入排序的賦值操作是比較操作的次數加上 (n-1)次。平均來說插入排序算法的時間復雜度為O(n^2)。因而,插入排序不適合對於數據量比較大的排序應用。但是,如果需要排序的數據量很小,例如,量級小於千,那么插入排序還是一個不錯的選擇

  • 最后:

    在這個文章快寫完的時候,剛剛說的冒泡排序測試結果出來了,給大家看看,結果經供參考,由於測試的方法存在科學性和嚴謹性,不一定真的代表這個算法的實際性能,有不足或錯誤之處,歡迎留言指正,謝謝~~~~

    花了21分23秒????看來我的冒泡算法有待優化~~~~各位大神如果有比較好的優化方案,歡迎留言指教。謝謝!

    下面是我測試冒泡算法的代碼:

    package 排序;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    public class BubbleSort {
        public static void main(String[] args){
    //        int[] arr={1,3,5,8,45,74};
            SimpleDateFormat time = new SimpleDateFormat("yyyy:MM:dd:HH:mm:ss");
            System.out.println(time.format(new Date()));
    
            int[] arr = new int[800000];
            for (int index = 0; index < 800000; index++) {
                arr[index] = (int)(Math.random() * 80000);
            }
            int temp = 0;
            boolean flag = true;
    
            for (int i = 0;i < arr.length-1;i++ ){
                for (int j = 0; j < arr.length-1-i ; j++) {
                    if (arr[j] > arr[j+1]) {
                        temp = arr[j];
                        arr[j] = arr[j+1];
                        arr[j+1] = temp;
                        flag = false;
                    }
                }
    
                if (flag){
                    break;
                }else {
                    flag = true;
                }
            }
    //        System.out.println(Arrays.toString(arr));
            SimpleDateFormat time2 = new SimpleDateFormat("yyyy:MM:dd:HH:mm:ss");
            System.out.println(time2.format(new Date()));
        }
    }
    
    


免責聲明!

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



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