归并排序

//归并排序非递归
void merge(elementType initList[], elementType mergeList[], int i, int m, int n)//归并两个有序的子表
{                                                                                //i为第一个子表开始的位置m第一个子表元素的个数 ,n为第二个子表的个数
	int j = m + 1;
	int k = i;
	while (i <= m && j <= n)
	{
		if (mergeList[i] <= mergeList[j])
			initList[k++] = mergeList[i++];
		else
			initList[k++] = mergeList[j++];
	}

	if (i > m)
		for (int t = j; t <= n; t++)
			initList[k++] = mergeList[t];
	else
		for (int t = i; t <=m; t++)
			initList[k++] = mergeList[t];
}

void mergePass(elementType initList[], elementType mergeList[], int n, int s) //每一次合并
{
	int i;
	for (i = 1; i <= n - 2 * s + 1; i += 2 * s)
		merge(initList, mergeList, i, i + s - 1, i + 2 * s - 1);
	
	if (i + s - 1 < n)
		merge(initList, mergeList, i, i + s - 1, n);
	else
	for (int j = i; j <= n; j++)
		initList[j] = mergeList[j];
	
	
}

void mergeSort( elementType mergeList[], int n)   //控制合并的次数以及合并区间大小
{
	elementType initList[100];
	int s = 1;
	while (s < n)
	{
		mergePass(initList, mergeList, n, s);
		s *= 2;

		mergePass(mergeList, initList, n, s);
		s *= 2;
	}
}
//归并排序非递归
void merge( elementType mergeList[], int r, int m, int n)
{
	int n1 = m - r + 1;
	int n2 = n - m;
	elementType *Left = new elementType[n1+1], *Right = new elementType[n2+1];
	for (int i = 1; i <= n1; i++)//将子集1放到Left数组中
	{
		Left[i] = mergeList[r + i-1];
	}
	for (int i = 1; i <= n2; i++)////将子集2放到Right数组中
	{
		Right[i] = mergeList[m +  i];
	}
	
	int i = 1, j = 1, k = r;
	while (i <= n1&&j <= n2)//开始合并
	{
		if (Left[i] <= Right[j])//为了稳定性要=
			mergeList[k++] = Left[i++];
		else
			mergeList[k++] = Right[j++];
	}
	if (i > m)//处理多余的数集
	{
		for (int t = j; t <= n2;t++)
		{
			mergeList[k++] = Right[t];
		}
	}
	else
	{
		for (int t = i; t <= n1; t++)
		{
			mergeList[k++] = Left[t];
		}

	}
	delete []Left;//注意对内存释放
	delete []Right;
}

void  mergeSort( elementType mergeList[], int Left, int Right)
{
	if (Left >= Right) return;      //要有递归出口

	mergeSort( mergeList, Left, (Left + Right) / 2); //分
	mergeSort( mergeList, (Left + Right) / 2 + 1, Right);
	merge( mergeList, Left, (Left + Right) / 2 , Right);//合并
}


你可能感兴趣的:(归并排序递归,归并排序非递归)