假如我們要從小到大排序,下面幾種簡單的演算法可以處理規模不大的資料,我寫成函式形式。
一、插入排序
思想就是:從左到右對每個數,每次在它前面找到乙個合適的位置把它插進去。
void insertsort(int a,intn)}
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,intn)}
比較次數 $c=n(n-1)/2$
移動次數 $m_=3(n-1),m_=0$
改進:樹形選擇排序(錦標賽排序)
是穩定排序。
時間複雜度$o(nlog_2n)$
輔助空間較多。
三、氣泡排序
思想:每次從左到右將每對相鄰的且逆序的數交換,可以使未排序的最大的數放到未排序數的最後。
void bubblesort(int a,intn) }
}}
呼叫:
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 ...