#include <stdio.h>
#include <stdlib.h>
//在求時間複雜度時,是用每一行代碼的時間複雜度進行相加得到的,應該是這樣去做.
//總的執行時間 = 2 × 輸入長度為n/2的sort函數的執行時間 + merge函數的執行時間Θ(n)
//採用分而治之的方法不是這樣嘛.
void merge(int *arr, int low, int mid, int high)
{
int i = low, j =mid+1,k=0;
int *pbuf = NULL;
pbuf = (int*)malloc(sizeof(int)*(high-low+1)); //這兩個參數都是數組的索引,要記得數組索引的特性.
if(pbuf==NULL)
{
printf("out of space!/n");
return;
}
while(i<=mid && j<=high)
{
pbuf[k++] = (arr[i]<arr[j])?arr[i++]:arr[j++];
}
while(i<=mid)
{
pbuf[k++] = arr[i++];
}
while(j<=high)
{
pbuf[k++] = arr[j++];
}
free(pbuf);
pbuf = NULL;
}
void merge_sort(int *arr, int start, int end)
{
int mid;
if(start<end)
{
mid = (end+start)/2;
merge_sort(arr, start, mid);
merge_sort(arr, mid+1, end);
merge(arr, start, mid, end);
}
}
int main(void)
{
int arr[100];
int i;
for(i=100; i>0; i--)
{
arr[i-1] = i;
}
merge_sort(arr, 0, 99);
for(i=0; i<100; i++)
{
printf("%d ", arr[i]);
if(i==20)
{
printf("/n");
}
}
printf("/n");
return 0;
}