排序演算法及分析(插入 希爾 選擇 冒泡)

2021-09-08 11:28:23 字數 987 閱讀 3904

假如我們要從小到大排序,下面幾種簡單的演算法可以處理規模不大的資料,我寫成函式形式。

一、插入排序

思想就是:從左到右對每個數,每次在它前面找到乙個合適的位置把它插進去。

void insertsort(int a,int

n)}

c是比較次數,m是移動次數,則

最好情況$c_=n-1$,$m_=0$;

最壞情況$c_=(n+2)*(n-1)/2$,$m_=\frac$

折半插入排序,找插入位置時可以二分。

表插入排序:基於鍊錶儲存。

希爾排序:

1)按增量d分組。

2)每組用直接插入排序。

3)然後減小d(有乙個增量序列,比如..15,7,3,1),回到1),最後一次d為1。  

int dlta[5]=;

void shellsort(int a,int

n) }

}

二、選擇排序

思想是:每次找未排序的部分(i到n)最小的,和第i個交換。

void selectsort(int a,int

n)}

比較次數 $c=n(n-1)/2$

移動次數  $m_=3(n-1),m_=0$

改進:樹形選擇排序(錦標賽排序)

是穩定排序。

時間複雜度$o(nlog_2n)$

輔助空間較多。

三、氣泡排序

思想:每次從左到右將每對相鄰的且逆序的數交換,可以使未排序的最大的數放到未排序數的最後。

void bubblesort(int a,int

n) }

}}

呼叫:

cin>>n;

for(int i=1; i<=n; i++)

cin>>a[i];

bubblesort(a,n);

選擇 冒泡 歸併 插入及希爾排序

選擇排序每次遍歷一遍陣列,找出最小的數,然後跟陣列的第乙個元素交換。再從剩下的元素中重複此步驟直至陣列排序完畢。時間複雜度與輸入資料無關,為o n 2 每次從首元素開始,從左到右交換相鄰且逆序的元素,一直交換到尾元素時即完成一輪迴圈,此時末尾元素即為最大值。接著在除尾元素外的剩餘元素中繼續上述迴圈,...

冒泡 選擇 插入 希爾排序

include include include using namespace std template void print const t a,int n 氣泡排序 每次迴圈總是將最大元素移到隊尾 o n 2 穩定的排序演算法 templatevoid bubblesort t a,int n ...

排序演算法 冒泡 選擇 插入與希爾排序

思路分析 依次比較相鄰的兩個數 將比較小的數放在前面,比較大的數放在後面 第一趟比較完後,最小的數放在第一位 那麼在第二趟的時候不需要再對第一位數進行比較 依次類推,每一趟比較次數依次減小 c 實現 include using namespace std void show int arr,int ...