歸併排序

歸併排序,是採用分治法的一個非常典型的應用。
時間複雜度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;
}

發佈了22 篇原創文章 · 獲贊 9 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章