經典演算法之歸併排序的C實現方法
阿新 • • 發佈:2019-01-06
以前寫過歸併排序的演算法,但是時間過了好久,忘記怎麼寫的了,(也是醉了)。正好複習演算法的時候遇到這個問題,就重新寫了一下,把遇到的一些問題順便記錄一下。
核心就是用兩個子陣列記錄分割後的兩個陣列中的變數, 然後依次比較大小即可。
這裡有個細節需要注意一下,
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);
}