C實現方法經典算法之歸并排序

jopen 9年前發布 | 3K 次閱讀 C/C++ 排序算法

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

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

源代碼如下:

// =====================【歸并排序】==================

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);

}</pre>

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!