時間複雜度O(nlogn)
空間複雜度O(n)
速度僅次於快速排序,但較穩定。
#include <iostream>
using namespace std;
/*
* array是元素序列,其中從索引first開始到mid位置,按照升序排列,
* 同時,從(mid+1)到last也已經按照升序排列,
* merge()函數將把這兩個已經排序好的子序列合併成一個排序序列。
* 結果放到array中。
*/
void Merge(int *array, int first, int mid, int last)
{
int i,k;
int begin1,end1, begin2,end2;
int size;
int *temp = (int *)malloc((last-first+1)*sizeof(int));
begin1 = first;
end1 = mid;
begin2 = mid+1;
end2 = last;
k = 0;
while(begin1<=end1 && begin2<=end2)
{
if (array[begin1] < array[begin2])
{
temp[k] = array[begin1];
begin1++;
}
else
{
temp[k] = array[begin2];
begin2++;
}
k++;
}
while(begin1 <= end1)
temp[k++] = array[begin1++];
while(begin2 <= end2)
temp[k++] = array[begin2++];
size = last-first+1;
for (i=0; i<size; i++)
{
array[first+i] = temp[i];
}
free(temp);
}
/* 歸併排序(遞歸實現) */
void MergeSort(int *array, int first, int last)
{
int mid = 0;
if ( first < last )
{
mid = (first + last) / 2 ;
MergeSort(array, first, mid);
MergeSort(array, mid+1, last);
Merge(array, first, mid, last);
}
}
int main(void)
{
int i;
int a[10] = {45,23,41,67,1,4,80,65,9,100};
MergeSort(a, 0, 9);
for(i=0; i<10; i++)
cout<<a[i] <<"\t" ;
cout<<endl;
return 0;
}