1. 程式人生 > >排序算法系列:歸併排序(Merge sort)(C語言)

排序算法系列:歸併排序(Merge sort)(C語言)

通俗理解:運用分而治之的思想,編寫遞迴函式,將大陣列排序轉化為小陣列排序,最後再將其合併。
void merge_sort(int*p,int low,int high)
{
	int mid = (low+high)/2;
	if (low <high)
	{
		merge_sort(p,low,mid);
		merge_sort(p,mid+1,high);
		merge(p,low,mid,high);
	}
}

void merge(int *p,int low,int mid,int high)
{
	int i,k;
	int* temp = (int*)malloc((high-low+1)*sizeof(int));//合併空間
	int start1 = low;
	int end1 = mid;
	int start2 = mid+1;
	int end2 = high;
	//比較兩個指標所指向的元素,選擇相對小的元素放入到合併空間,並移動指標到下一位置
	for (k = 0;start1<=end1 && start2<=end2;k++)
	{
		if (p[start1]<p[start2])
			temp[k] = p[start1++];
		else
			temp[k] = p[start2++];
	}
	//檢測剩餘項,若有剩餘,直接拷貝出來粘到合併序列尾
	while (start1<=end1)
		temp[k++] = p[start1++];
	while (start2<=end2)
		temp[k++] = p[start2++];
	//將排好序的陣列拷貝到原陣列
	for (i = 0;i<high-low+1;i++)
		p[low+i] = temp[i];
	//合併過程
	printf("%d:",mid);
	for (i = 0;i<high-low+1;i++)
		printf("%d ",p[low+i]);
	printf("\n");
	free(temp);
}
平均時間複雜度Θ(n log n)