c++ 排序算法 归并排序 代码详解

参考:算法第四版
想看图解的话:C++ 归并排序与快速排序
手残,不会画

简介:

c++ 排序算法 归并排序 代码详解_第1张图片
c++ 排序算法 归并排序 代码详解_第2张图片
上图来源:https://blog.csdn.net/zpznba/article/details/83745205

代码:

#include
#include
using namespace std;
void Individual(int A[], int size)
{
	srand((unsigned)time(NULL));
	for (int i = 0; i < size; i++)
		A[i] = rand() % 100;
}
void Output(int A[], int size)
{
	cout << endl;
	for (int i = 0, j = 0; i < size; i++)
	{
		cout << A[i] << " ";
		j++;
		if (j == 10)
		{
			cout << endl;
			j = 0;
		}

	}
	cout << endl;
}
void swap(int A[], int i, int j)
{
	int t = A[i];
	A[i] = A[j];
	A[j] = t;
}


//子区间的元素合并
/*步骤:
	1、创建该区间大小的数组tempArr[n]  (A的left到right区间)
	2、如果左子区间的第i个元素小于等于右子区间的第j个元素
	3、把该元素放到tempArr数组的已有元素后面
	4、同理,左子区间的第i个元素大于右子区间的第j个元素
	5、把该元素放到tempArr数组的已有元素后面
	6、直到左或右区间的元素放到tempArr数组完毕,把另一个区间的剩余元素(子区间的元素都已有序)直接复制进tempArr数组
	7、把tempArr数组的元素复制到原数组的left到right区间
*/
void MergeArray(int A[], int left, int mid, int right)
{
	//1、创建该区间大小的数组tempArr[n]  (A的left到right区间)
	int n = right - left + 1;
	int* tempArr = new int[n];
	

	int i = left, j = mid+1;
	for (int  k = 0; k < n; k++)
	{
		//6、左的元素放到tempArr数组完毕,把另一个区间的剩余元素直接复制进tempArr数组
		if (i > mid)
			tempArr[k] = A[j++];

		//6、右区间的元素放到tempArr数组完毕,把另一个区间的剩余元素直接复制进tempArr数组
		else if (j > right)
			tempArr[k] = A[i++];

		//4、左子区间的第i个元素大于右子区间的第j个元素
		//5、把该元素放到tempArr数组的已有元素后面
		else if (A[j] < A[i])
			tempArr[k] = A[j++];

		//2、如果左子区间的第i个元素小于等于右子区间的第j个元素
		//3、把该元素放到tempArr数组的已有元素后面
		else
			tempArr[k] = A[i++];
	}
	//7、把tempArr数组的元素复制到原数组的left到right区间
	for (int k = 0; k < n; k++)
	{
		A[left+k] = tempArr[k];
	}
	delete[] tempArr;
}

void Merge(int A[], int left, int right)
{
	if (left >= right) 
		return;    //分解到每一个区间只有一个元素

	int mid = (left+right ) / 2;

	//划分区间,每一区间都分为两个子区间,直到区间只有一个元素
	Merge(A, left, mid);
	Merge(A, mid + 1, right);

	//把子区间的元素合并,
	MergeArray(A, left, mid, right);

}

//归并排序:
void MergeSort(int A[], int size)
{
	Merge(A, 0, size - 1);
}

int main()
{
	int n;
	cout << "请输入要排序的数组大小:" << endl;
	cin >> n;
	int* array = new int[n];
	Individual(array, n);

	Output(array, n);

	MergeSort(array, n);

	Output(array, n);

	delete[] array;
	return 0;
}

你可能感兴趣的:(c++经典排序算法)