1. 程式人生 > >經典演算法之歸併排序的C實現方法

經典演算法之歸併排序的C實現方法

以前寫過歸併排序的演算法,但是時間過了好久,忘記怎麼寫的了,(也是醉了)。正好複習演算法的時候遇到這個問題,就重新寫了一下,把遇到的一些問題順便記錄一下。

核心就是用兩個子陣列記錄分割後的兩個陣列中的變數, 然後依次比較大小即可。
這裡有個細節需要注意一下,
arr_temp1[mid + 1 - low] = INT_MAX;
這段程式碼,用來設定一個哨兵, 用這種方法可以避免判斷陣列是否為空了

具體的演算法的虛擬碼可以參考《演算法導論》 Chapter 2 演算法基礎, P17

原始碼如下:

// =====================【歸併排序 】==================
// @ author : zhyh2010 // @ date : 20150606 // @ version : 1.0 // @ description : // =====================【歸併排序】================== #include <stdio.h> #include <stdlib.h> #include <time.h> #include <math.h> #define NUM 20 int arr[NUM] = { 0
}; int arr_temp1[NUM] = { 0 }; int arr_temp2[NUM] = { 0 }; void init() { time_t tm; time(&tm); srand((unsigned int)tm); int max_item = 100; for (int i = 0; i != NUM; i++) arr[i] = rand() % max_item; } void display(int * arr) { for (int i = 0; i != NUM; i++) printf
("%-10d", arr[i]); printf("\n"); } void merge(int low, int mid, int high) { for (int ii = 0; ii != mid + 1 - low; ii++) { arr_temp1[ii] = arr[low + ii]; } arr_temp1[mid + 1 - low] = INT_MAX; for (int ii = 0; ii != high - mid; ii++) { arr_temp2[ii] = arr[mid + 1 + ii]; } arr_temp2[high - mid] = INT_MAX; int i = 0; int j = 0; for (int k = low; k != high + 1; k++) { if (arr_temp1[i] < arr_temp2[j]) arr[k] = arr_temp1[i++]; else arr[k] = arr_temp2[j++]; } } void mergeSort(int low, int high) { if (low >= high) return; int mid = (low + high) / 2; mergeSort(low, mid); mergeSort(mid + 1, high); merge(low, mid, high); } void main() { init(); printf("歸併排序前\n"); display(arr); mergeSort(0, NUM - 1); printf("歸併排序後\n"); display(arr); }