并归排序的实现

#include "iostream"
#include "cstdlib"
#include "ctime"
using namespace std;
void merge(int* arr, int p, int q, int r);
void Merge_Sort(int* arr, int p, int r);
int* text_Seed_Time(int n);

int main()
{
	int arr_Size;

	cout << "Please enter the size of arr: ";

	cin >> arr_Size;

	int* text_Arr = new int[arr_Size];

	cout << "下面是随机产生的一个数组: ";

	for (int i = 0; i<arr_Size; i++)
	{
		text_Arr[i] = *(text_Seed_Time(arr_Size) + i);
	}
	for (int i = 0; i<arr_Size; i++)
	{
		cout << text_Arr[i] << " ";
	}

	Merge_Sort(text_Arr, 0, arr_Size - 1);
	cout << endl << "通过并归排序的结果: " << endl;
	for (int i = 0; i<arr_Size; i++)
	{
		cout << text_Arr[i] << " ";
	}

	cin.get();
	cin.get();



}



void merge(int* arr, int p, int q, int r)   //其中arr为数组, p,q,r分别为数组下标(p<q<r)
{
	//先定义两个新的子数组,并将它们初始化为  数组arr,已经排好序的两端。
	int left_Count = q - p + 1;
	int right_Count = r - q;

	//int left_Arr[left_Count + 1];         //多设置一位为哨兵值,用于判断在比较的时候是否某一个数组已经比较完成;
	//int right_Arr[right_Count + 1];

	int* left_Arr = new int[left_Count + 1];
	int* right_Arr = new int[right_Count + 1];

	for (int i = 0; i<left_Count; i++)
		left_Arr[i] = arr[p+i];//left_Arr[i] = arr[p]  这是自己第一次写的时候找半天没找到的Bug忘记加上变量i,将同一个值赋值给整个数组。
	for (int i = 0; i<right_Count; i++)
		right_Arr[i] = arr[q + 1+i];//此语句同上。

	left_Arr[left_Count] = right_Arr[right_Count] = 10000;

	int left_i = 0;
	int right_i = 0;
	for (int i = 0; i<(r - p + 1); i++)
	{
		if (left_Arr[left_i] <= right_Arr[right_i])
		{
			arr[p + i] = left_Arr[left_i];
			left_i++;
		}
		else
		{
			arr[p + i] = right_Arr[right_i];
			right_i++;
		}
	}
}

void Merge_Sort(int* arr, int p, int r)
{
	if (p<r)
	{
		int q = (p + r) / 2;
		Merge_Sort(arr, p, q);
		Merge_Sort(arr, q + 1, r);
		merge(arr, p, q, r);
	}

}



int* text_Seed_Time(int n)
{
	int* TSV = new int[n];
	srand((unsigned)time(NULL));
	for (int i = 0; i<n; i++)
		TSV[i] = rand() % (n * 2) + 1;      //产生的数组值的大小范围是(0 n*2) 其中n为数组的规模大小;
	return TSV;
}


下面是测试结果:

猜你喜欢

转载自blog.csdn.net/lily559/article/details/80660507