数据结构、排序算法、归并排序

//将有序子序列合并成大序列
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;
	}
}

猜你喜欢

转载自my.oschina.net/u/3397950/blog/1791469