數據結構、排序算法、歸併排序

//將有序子序列合併成大序列
void mergeSub(int *a, int start, int middle,int end)
{
	//申請輔助空間
	int len = end - start + 1;
	int *b = new int[len];
	int i = start;
	int j = middle + 1;
	int k = 0;
	while (i<=middle && j<=end)
	{
		b[k++] = a[i] < a[j] ? a[i++] : a[j++];
	}
	while (i<=middle)
	{
		b[k++] = a[i++];
	}
	while (j<=end)
	{
		b[k++] = a[j++];
	}
	for (int i = 0; i < len;i++)
	{
		a[start++] = b[i];
	}
	delete[]b;
}
//歸併排序--遞歸實現(自頂向下)
void mergeSort(int *a, int start,int end)
{
	int middle = (start + end) / 2;
	if (start==end)
	{
		return;
	}
	mergeSort(a, start, middle);
	mergeSort(a, middle + 1, end);
	mergeSub(a, start, middle, end);
}
//歸併排序--迭代實現(自底向上)
void mergeSortIterator(int *a, int start, int end)
{
	int length = 1;   //子序列的長度
	while (length<end)
	{
		int i = 0;
		for (;i+2*length-1<=end;i=i+2*length-1 )
		{
			mergeSub(a, i, i + length - 1, i + 2 * length - 1);
		}
		if (i+length-1<end)
		{
			mergeSub(a, i, i + length - 1, end);
		}
		length *= 2;
	}
}
相關文章
相關標籤/搜索