排序算法(一)---- 直接插入排序

基本思想:取序列中的第i個元素,(在取到第i個元素之前,第i個元素前面的序列已經經過排序,成爲有序序列,第i個元素及其之後的序列即爲無序序列),將第i個元素與之前的有序序列中的元素依次進行比較,並將其插入到合適的位置,由此對原序列中的每一個元素進行上述操作,即可得到有序序列
因爲在獲取待插入元素的時候要對數組進行一次遍歷,而每遍歷到一個元素又要將其與之前的有序序列中的元素進行比較,又要進行一次遍歷,因此最差的時間複雜度爲O(N^2),即當整個數組剛好與所要求的排序序列順序相反;與之對應的則是最優時間複雜度爲O(N),即整個數組的序列與所要求的順序序列一致,相當於只進行一次遍歷
空間複雜度爲O(1),且算法穩定性穩定(即原序列中的兩個相等元素的先後次序在排序前後並不會發生改變)

而對於上面的直接插入排序算法屬於邊比較,邊搬移元素,比較簡單,很容易想通,但是效率也比較低,而最容易想到的優化方案,就是先找插入位置,在進行元素的搬移,這樣一來,在找插入元素的時候由於是有序序列,可以採用二分查找來進行相應的優化
代碼如下:
int BinarySearch(int arr[],int size,int data)
{
       int left=0;
       int right=size;
       while(left<right)
       {
              int mid=(left&right)+((left^right)>>1);
              if(arr[mid]>data)
                     right=mid;
              else
                     left=mid+1;
       }

       return left;
}

void InsertSort(int arr[],int size)
{
       assert(arr);
       int i=1;

       for(;i<size;i++)
       {
              int pos=BinarySearch(arr,i,arr[i]);
              int data=arr[i];
              int end=i;
              while(end>pos)
              {
                     arr[end]=arr[end-1];
                     end--;
              }
              arr[pos]=data;
       }
}

這樣一來,時間複雜度可以爲O(NlogN)

對於插入排序而言,無論有沒有加入二分查找進行優化,它都是比較適用於數據量小,而且序列接近所要的順序的數據序列


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章