資料結構演算法 插入排序

2021-08-11 04:22:59 字數 1710 閱讀 7172

插入排序演算法有兩種,一種是直接插入排序,一種是折半插入排序

直接插入排序(straight insertion sort)

每次從無序表中取出第乙個元素,把它插入到有序表的合適位置,使有序表仍然有序。

第一趟比較前兩個數,然後把第二個數按大小插入到有序表中; 第二趟把第三個資料與前兩個數從後向前掃瞄,把第三個數按大小插入到有序表中;依次進行下去,進行了(n-1)趟掃瞄以後就完成了整個排序過程。

直接插入排序是由兩層巢狀迴圈組成的。外層迴圈標識並決定待比較的數值。內層迴圈為待比較數值確定其最終位置。直接插入排序是將待比較的數值與它的前乙個數值進行比較,所以外層迴圈是從第二個數值開始的。當前一數值比待比較數值大的情況下繼續迴圈比較,直到找到比待比較數值小的並將待比較數值置入其後一位置,結束該次迴圈。

插入排序的基本方法是:每步將乙個待排序的記錄按其關鍵字的大小插到前面已經排序的序列中的適當位置,直到全部記錄插入完畢為止。

直接插入排序是一種穩定排序演算法!

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

cmin = n-1mmin = 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

void insertsort(int a, int n)

else

}for(j=i-1; j >= low; --j)

//將值插入到指定位置

array[low] = temp;}}

兩個者的區別是:
折半插入排序基本思想和直接插入排序一樣,區別在於尋找插入位置的方法不同,折半插入排序採用折半查詢法來尋找插入位置。折半查詢法只能對有序的序列使用。基本思想就是查詢插入位置的時候,把序列分成兩半(選擇乙個中間數mid),如果帶插入資料大於mid則到右半部分序列去在進行折半查詢;反之,則到左半部分序列去折半查詢。

折半插入排序在記錄移動次數上和直接插入排序是一樣,所以演算法時間複雜度也是一樣,只是在尋找插入位置的時候可能會節約相當多的時間。

資料結構 排序演算法之插入排序

一 排序概念 1 概念 排序是計算機內經常進行的一種操作,其目的是將一組 無序 的記錄序列調整為 有序 的記錄序列。分內部排序和外部排序。若整個排序過程不需要訪問外存便能完成,則稱此類排序問題為內部排序。反之,若參加排序的記錄數量很大,整個序列的排序過程不可能在記憶體中完成,則稱此類排序問題為外部排...

資料結構與演算法 插入排序

將乙個資料插入到已經排好序的有序資料中,從而得到乙個新的 個數加一的有序資料 插入排序分為兩種 直接插入排序和希爾排序 插入排序與打撲克時整理手上的牌非常類似。摸來的第1張牌無須整理,此後每次從桌上的牌 無序區 中摸最上面的1張並插入左手的牌 有序區 中正確的位置上。為了找到這個正確的位置,須自左向...

資料結構和演算法 插入排序

直接插入排序的基本操作是將乙個記錄插入到已經排好的有序表中,從而得到乙個新的 記錄數增1的有序表。對於給定的一組記錄,初始時假定第乙個記錄自成乙個有序序列,其餘記錄為無序序列。接著從第二個記錄開始,按照記錄的大小依次將當前處理的記錄插入到其之前的有序序列中,直到最後乙個記錄插到有序序列中為止。當最好...