常用排序演算法

2021-07-30 03:09:55 字數 4543 閱讀 9241

一、氣泡排序

氣泡排序是最簡單的排序演算法。假設陣列一共有n個元素,元素最大下標為n-1,氣泡排序的具體做法是:第一趟在序列(a[0]~a[n-1])中從前往後進行兩個相鄰元素的比較,若前者大,則交換,比較 n-1 次;第一趟排序結束,最大元素被交換到a[n-1]中,下一趟排序只需要在子串行(a[0]~a[n-2])中進行;依次類推,氣泡排序最多進行 n-1 趟。基本的氣泡排序可以利用旗標的方式稍微減少一些比較的時間,當尋訪完序列後都沒有發生任何的交換動作,表示排序已經完成,而無需再進行之後的比較與交換動作。 

優點:穩定,比較次數已知;

缺點:慢,每次只能移動相鄰兩個資料,移動資料的次數多。

c語言實現:

#includevoid bubblesort(int arr,int n);

void swap(int *a,int *b);

#define n 10

int main();

bubblesort(arr,n);

printf("排序後:");

for(i=0;iarr[j+1])

} }}/*兩數交換*/

void swap(int *a,int *b)

氣泡排序最好的情況下只需進行一趟排序,(n-1)次比較,此時的時間複雜度為o(n),無需移動元素;最壞的情況下進行 n-1 趟排序,時間複雜度為o(n2);氣泡排序是穩定的排序演算法。

二、選擇排序

原理:將初始序列(a[0]~a[n-1])作為待排序序列,第一趟在待排序序列(a[0]~a[n-1])中找到最小值元素,將其與第乙個元素a[0]交換,這樣子序列(a[0])已經有序,下一趟在排序在待排序子串行(a[1]~a[n-1])中進行。第i趟排序在待排序子串行(a[i-1]~a[n-1])中找到最小值元素,與該子串行中第乙個元素a[i-1]交換。經過 n-1 趟排序後使得初始序列有序。

優點:比較次數與氣泡排序一樣,資料移動次數比氣泡排序少;

缺點:相對之下還是慢。

c語言實現:

#includevoid selectsort(int arr,int n);

void swap(int *a,int *b);

#define n 10

int main();

selectsort(arr,n);

printf("排序後:");

for(i=0;i選擇排序的最好、最壞和平均情況的時間複雜度都為o(n2),而且它還需交換元素(n-1)次和移動元素3(n-1)次;它是不穩定的排序演算法。

三、插入排序

原理:將初始序列中的第乙個元素作為乙個有序序列,然後將剩下的 n-1 個元素按關鍵字大小依次插入該有序序列,每插入乙個元素後依然保持該序列有序,經過 n-1 趟排序後使初始序列有序。

優點:穩定,快;

缺點:比較次數不一定,比較次數越少,插入點後的資料移動越多,特別是當資料總量龐大的時候,但用鍊錶可以解決這個問題。

c語言實現:

#includevoid insertsort(int arr,int n);

#define n 10

int main();

insertsort(arr,n);

printf("排序後:");

for(i=0;i

其他說明:插入排序在最好的情況下時間複雜度為o(n),比較次數為(n-1)次,移動元素次數是2(n-1);最壞的情況下時間複雜度為o(n2);插入排序是穩定的排序演算法。

四、快速排序

原理:快速排序是找出乙個元素(理論上可以隨便找乙個)作為基準,然後對陣列進行分割槽操作,使基準左邊元素的值都不大於基準值,基準右邊的元素值 都不小於基準值,如此作為基準的元素調整到排序後的正確位置。遞迴快速排序,將其他n-1個元素也調整到排序後的正確位置。最後每個元素都是在排序後的正確位置,排序完成。所以快速排序演算法的核心演算法是分割槽操作,即如何調整基準的位置以及調整返回基準的最終位置以便分治遞迴。

優點:極快,資料移動少;

缺點:不穩定。

c語言實現:

#includevoid quicksort(int arr,int left,int right);

#define n 10

int main();

quicksort(arr,0,n-1);

printf("排序後:");

for(i=0;ikey)

arr[low] = arr[high]; // 將該數放到key值的左邊

while(low < high && arr[low] < key)

arr[high] = arr[low]; // 將該數放到key值的右邊

}arr[low] = key; // 把key值填充到low位置,下次重新找key值

quicksort(arr,left,low-1); //將key值左邊的數遞迴排序

quicksort(arr,low+1,right); //將key值右邊的數遞迴排序 } }

其它說明:在最好情況下,每次劃分所取的基準都是當前無序區的"中值"記錄,劃分的結果是基準的左、右兩個無序子區間的長度大致相等。總的關鍵字比較次數:o(nlogn),儘管快速排序的最壞時間為o(n2),但就平均效能而言,它是基於關鍵字比較的內部排序演算法中速度最快者,快速排序亦因此而得名。它的平均時間複雜度為o(nlogn)。快速排序是不穩定的排序演算法。

五、歸併排序

原理:將n個待排序的記錄看作由n個長度為1(即由乙個記錄構成)的子檔案組成。每兩個相鄰的有序子檔案分成一組,共有n/2組,對每一組進行排序,這樣就可以得到長度為2的n/2個有序子檔案。重複這個過程,即可得到長度為n的乙個有序檔案。

優點:快速、穩定

缺點:對資料的有序性不敏感,如果改造成索引操作,效果就非常好了

c語言實現:

#includevoid mergesort(int arr, int left, int right);

void merge(int arr, int left, int center, int right);

#define n 10

int main();

mergesort(arr,0,n-1);

printf("排序後:");

for(i=0;i= right) return;

// 找出中間索引

int center = (left + right) / 2;

// 對左邊陣列進行遞迴

mergesort(arr, left, center);

// 對右邊陣列進行遞迴

mergesort(arr, center + 1, right);

// 合併

merge(arr, left, center, right);

} /**

* 將兩個陣列進行歸併,歸併前面2個陣列已有序,歸併後依然有序

* @param arr 陣列物件

* @param left 左陣列的第乙個元素的索引

* @param center 左陣列的最後乙個元素的索引,center+1是右陣列第乙個元素的索引

* @param right 右陣列最後乙個元素的索引

*/void merge(int arr, int left, int center, int right) else

}// 剩餘部分依次放入臨時陣列(實際上兩個while只會執行其中乙個)

while (mid <= right)

while (left <= center)

// 將臨時陣列中的內容拷貝回原陣列中

// (原left-right範圍的內容被複製回原陣列)

while (tmp <= right)

}

其它說明:由於歸併排序每趟歸併都會使得有序子段的長度增長1倍,即是原有序子段的2倍,所以從長度為1的子段開始,需經過log2n次一趟歸併才能產生長度為n的有序段。而每一趟歸併至多進行n-1次比較。所以其時間複雜度為o(nlog2n)。最好情況、最壞情況、平均情況下,時間複雜度都是o(nlog2n)。歸併排序是穩定的排序演算法。歸併排序需要和待排序檔案容量相同的輔助儲存空間。

六、希爾排序

希爾排序,也稱遞減增量排序演算法,是插入排序的一種更高效的改進版本。希爾排序是不穩定排序演算法。希爾排序是基於插入排序的以下兩點性質而提出改進方法的:

原理:已知一組無序資料a[1]、a[2]、……a[n],需將其按公升序排列。發現當n不大時,插入排序的效果很好。首先取一增量d(d

優點:快,資料移動少;

缺點:不穩定,d的取值是多少,應取多少個不同的值,都無法確切知道,只能憑經驗來取。

c語言實現:

#includevoid shellsort(int arr,int n);

#define n 10

int main();

shellsort(arr,n);

printf("排序後:");

for(i=0;i0;gap/=2) }}

}

各種排序演算法比較:

常用排序演算法

筆者最近學習演算法,學了很久也只弄懂了幾個排序演算法,在這裡曬一下下,作為以後參考之用。一 為什麼要研究排序問題 許多計算機科學家認為,排序演算法是演算法學習中最基本的問題,原因有以下幾點 l有時候應用程式本身需要對資訊進行排序,如為了準備客戶賬目,銀行需要對支票賬號進行排序 l很多演算法將排序作為...

常用排序演算法

一 簡單排序演算法 由於程式比較簡單,所以沒有加什麼注釋。所有的程式都給出了完整的執行 並在我的vc環境 下執行通過。因為沒有涉及mfc和windows的內容,所以在borland c 的平台上應該也不會有什麼 問題的。在 的後面給出了執行過程示意,希望對理解有幫助。1.冒泡法 這是最原始,也是眾所...

常用排序演算法

排序演算法 最好時間 平均時間 最壞時間 輔助空間 穩定性 直接插入排序 o n o n 2 o n 2 o 1 穩定 希爾排序 o n 1.3 o 1 不穩定 直接選擇排序 o n 2 o n 2 o n 2 o 1 不穩定 堆排序 o n x lbn o n x lbn o n x lbn o ...