⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cpp

📁 首先通过递归调用
💻 CPP
字号:
/*
基本算法思想:
   首先通过递归调用,将原数组不断的分小,最终将数组分成N份。
   然后将有序的两组合并成一个有序数组,每合并一次数组的规模
   就会翻倍,最终会将原来无序的数组变成一个有序的数组。
*/
#include<iostream>
using namespace std;
int n = 0;
void mergesort(int p[20], int start, int end);
void smerge(int p[20], int start, int mid, int end);
void main()
{
	int sorts[20];
	int m;
	cout << "请输入要排序的元素数目:" ;
	cin >> m;
	cout << "请输入排序的" << m << "元素序列:" << endl;
	for(int i=0; i<m; i++)
		cin >> sorts[i];
	mergesort(sorts, 0, m-1);
	for(i=0; i<m; i++)
		cout << sorts[i] << " ";
	cout << endl;
	cout << "s算法执行的赋值次数:";
	cout << n << endl;
}
/*

 p[20] 要排序元素所在的数组
 start 要排序元素第一个元素的位置
 end   要排序元素最后一个元素的位置
*/
void mergesort(int p[20], int start, int end)
{
	int mid;
	if(start < end)
	{
		mid = (start+end)/2;
		mergesort(p, start, mid);//排序 递归调用
		mergesort(p, mid+1, end);//排序 递归调用
		smerge(p, start, mid, end);//合并
	}
}
//合并函数
void smerge(int p[20], int start, int mid, int end)
{
	int b[20];
	int i = 0;
	int index1 = start;
	int index2 = mid + 1;
	while(index1<mid+1&&index2<end+1)//两数组都没有用光
	{
		if(p[index1] < p[index2])
		{
			n++;
			b[i] = p[index1];
			i++;
			index1++;
		}
		else
		{
			n++;
			b[i] = p[index2];
			i++;
			index2++;
		}
	}
	if(index1 < mid+1)//第二个序列已经用完,而第一个没有用完
	{
		while(index1 < mid+1)
		{
			b[i] = p[index1];
			i++;
			index1++;
			n++;
		}
	}
	else
	{
		while(index2 < end+1)//第一个序列已经用完,而第二个没有用完
		{
			b[i] = p[index2];
			i++;
			index2++;
			n++;
		}
	}
	i = 0;
	for(int k=start; k<end+1; k++)//将有序的数赋回原数组,不能改变起始位置
	{
		p[k] = b[i];
		i++;
		n++;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -