1. 程式人生 > >JS實現插入排序

JS實現插入排序

一,插入排序
1,演算法簡介
插入排序的工作原理就是將未排序資料,對已排序資料序列從後向前掃描,找到對應的位置並插入。插入排序通常採用佔位的形式,空間複雜度為O(1),因此,在從後向前掃描的過程中,需要反覆的把已排序的元素逐步向後挪位,為新插入元素提供插入的位置。
2,演算法描述
1)從第一個元素開始,該元素可以被認為已經被排序
2)取出下一個元素,在已經排好序的序列中從後往前掃描
3)直到找到小於或者等於該元素的位置
4)將該位置後面的所有已排序的元素從後往前依次移一位
5)將該元素插入到該位置
6)重複步驟2~5

3,演算法分析

如果目標是升序排序,那麼插入排序有最好情況和最壞情況兩種。最好情況是,序列已經是升序排列,那麼只需要比較n-1次,當序列是降序排列,那麼比較次數是n(n-1)/2,賦值操作是比較次數減去(n-1)次。平均來說,插入演算法時間複雜度是O(n^2),空間複雜度是O(1)。我們可以看到,當n較大時,時間複雜度太大,因此插入排序的不適合大資料量的排序,一般來說適合小資料量排序,如n<1000,插入排序也作為快排的補充,當n<8時,使用插排,否則使用快排。

時間複雜度最好為o(n) 最壞為(n^2) 平均為o(n^2)   空間複雜度為o(1) 穩定

4,程式碼實現
  1.    function insertSort(arr) {
            var len =arr.length;
            for (var i=1;i<len; i++) {
                var temp=arr[i];
                var j=i-1;//預設已排序的元素
                while (j>=0 && arr[j]>temp) {  //在已排序好的佇列中從後向前掃描
                        arr[j+1]=arr[j]; //已排序的元素大於新元素,將該元素移到一下個位置
                        j--;
                    }
                arr[j+1]=temp;
                }
            return arr
         }

5,考察點,重點和考察頻度分析
插排由於效率不高,速度較慢,大題考察少,出現頻度不高,重點在於時間複雜度、空間複雜度、移動次數考察。

二,二分插入排序
1,演算法簡介
二分插入排序時一種直接在插入排序上進行小改動的演算法,與直接插排最大的區別在於查詢插入位置時使用的是二分查詢的方式。 
2,演算法描述
1,從第一個元素開始,認為該元素已排序。
2,取出下一個元素,在已排序序列中二分查詢到第一個比它大的數的位置
3,將元素插入到該位置後
4,重複上述兩步

3,演算法分析

由於只是改進了插入位置查詢方法,所以空間複雜度仍然是O(1),插入每個記錄需要查詢logi次,最多移動i+1次,因此,最佳情況時間複雜度是O(nlogn),最差和平均情況是O(n^2)。

4,程式碼實現

function binaryInsertSort(arr) {
        var len =arr.length;
        for (var i=1;i<len; i++) {
            var key=arr[i],left=0,right=i-1;
            while(left<=right){       //在已排序的元素中二分查詢第一個比它大的值
              var mid= parseInt((left+right)/2); //二分查詢的中間值
              if(key<arr[mid]){ //當前值比中間值小  則在左邊的子陣列中繼續尋找   
                right = mid-1;
              }else{
                left=mid+1;//當前值比中間值大   在右邊的子陣列繼續尋找
              }
            }              
            for(var j=i-1;j>=left;j--){
              arr[j+1]=arr[j];
            }
            arr[left]=key;
          }
        return arr;
     }    

5,考察點、重點、頻度分析

和直接插排一樣,二分插排效率依舊可能不高,這依賴於初始序列,但是二分查詢思想是一個很好的思想,重點掌握。