【归并排序】 Merge_sort 实现源码 (自写)

学校算法老师给布置了个归并排序的实现作为作业……

实在闲着无事……请允许吾辈卖个萌做个简单的命令行界面程序,以下为源码。

过程中会有简单的解释语句的输出,所以过程看的还算清楚,用以对(int)1e9以下的正整数的归并排序实现源代码。


废话不多说,贴代码:

#include <cmath> 
#include <cctype>
#include <cstdio>
#include <string>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <windows.h>
#include <algorithm>
using namespace std;
typedef long long ll;

//******************************//
//*Author: okcd00 at 2014/09/24*//
//*StuNo.: 20125209			   *//
//*Name	: 陈点 物联网一班	   *//
//* 个人作品,请勿随意盗版哦 ~ *// 
//******************************//

#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))

ll arr[1024],al[512],ar[512];
string pause;

bool cmp(const int a, const int b){return a > b;}

void welcome()
{
	cout<<"┏══════════════┓"<<endl;
	cout<<"┃Author: okcd00              ┃"<<endl;
	cout<<"┃StuNo.: 20125209            ┃"<<endl;
	cout<<"┃Time  : 2014/09/24          ┃"<<endl;
	cout<<"┃From  : 陈点 物联网一班     ┃"<<endl;
	cout<<"┣──────────────┨"<<endl;
	cout<<"┃ ★个人作品,请勿随意盗版★ ┃"<<endl;
	cout<<"┗══════════════┛"<<endl;
}

void menu()
{
	system("cls");
	cout<<"┏══════════════┓"<<endl 
	    <<"┃Author:  okcd00             ┃"<<endl 
	    <<"┃StuNo.:  20125209           ┃"<<endl 
	    <<"┃Time  :  2014/09/24         ┃"<<endl 
	    <<"┃From  :  陈点 物联网一班    ┃"<<endl 
	    <<"┣──────────────┨"<<endl 
	    <<"┃ 请输入指令,以回车键结束   ┃"<<endl 
	    <<"┃★(s)start: 开始 MergeSort★┃"<<endl 
	    <<"┃★(q)quit : 结束程序并退出★┃"<<endl 
	    <<"┃★%others%: 请重新输入    ★┃"<<endl 
	    <<"┃★个人作品★★请勿随意盗版★┃"<<endl 
	    <<"┗══════════════┛"<<endl;
}

void end()
{
	system("cls");
	cout<<"┏══════════════┓"<<endl
	    <<"┃Author:  okcd00             ┃"<<endl
	    <<"┃StuNo.:  20125209           ┃"<<endl
	    <<"┃Time  :  2014/09/24         ┃"<<endl
	    <<"┃From  :  陈点 物联网一班    ┃"<<endl
	    <<"┣──────────────┨"<<endl
	    <<"┃ ★  程序结束,即将退出  ★ ┃"<<endl
	    <<"┗══════════════┛"<<endl;
}

int mergetime=1;
void get_merge(int l,int r)
{
	if(l+1>=r) return;
	int pos1=0,pos2=0;
	for(int i=l;i<(l+r)/2;i++) al[i-l]=arr[i];
	for(int i=(l+r)/2;i<r;i++) ar[i-(l+r)/2]=arr[i];
	for(int i=l;i<r;i++)
	{
		if(pos2==r-(l+r)/2) arr[i]=al[pos1],pos1++;
		else if(pos1==(l+r)/2-l) arr[i]=ar[pos2],pos2++;
		else if(al[pos1]<=ar[pos2]) arr[i]=al[pos1],pos1++;
		else arr[i]=ar[pos2],pos2++;
	}
	cout<<"[第"<<mergetime++<<"次] getMerge: "<<"lef="<<l<<", rig="<<r<<endl;
	for(int i=l;i<r;i++)	cout<<arr[i]<<"\t";
	cout<<endl<<endl;
}

void do_merge(int l,int r)
{
	int lef=l,rig=r;
	if(lef+1>=rig) return ;
	else 
	{
		do_merge(lef,(lef+rig)/2);
		do_merge((lef+rig)/2,rig);
		get_merge(lef,rig);
	}
}

void merge_sort()
{
	cout<<"—— 请输入你想要排序的数字  ——" <<endl; 
	cout<<"——(以空格分隔,以-1结束) ——" <<endl;
	cout<<"我的数组为(数字个数不超过1K):"; 
	int pos=0;	ll now=0;
	while(1)
	{
		scanf("%I64d",&now);
		if(now!=-1)	arr[pos++]=now;
		else break;
	}
	system("cls");
	cout<<"★以下为我的数组★"<<endl;
	for(int i=0;i<pos;i++)
	{
		if(i!=0 && i%5==0) printf("┃\n");
		printf("┃ %010I64d ",arr[i]);
		//if(arr[i]<(int)1e5) cout<<"\t";
	}
	cout<<endl<<endl<<"——接下来开始进行归并排序——"<<endl<<endl;
	system("pause"); 
	do_merge(0,pos);
	cout<<"——归并排序完毕,输出结果——"<<endl;
	for(int i=0;i<pos;i++)
	{
		if(i!=0 && i%5==0) printf("┃\n");
		printf("┃ %010I64d ",arr[i]);
		//if(arr[i]<(int)1e5) cout<<"\t";
	}
	cout<<endl;
	system("pause"); 
}

int main()
{
	string s;
	welcome();
	system("pause"); 
	while(1)
	{
		menu();	
		cin>>s;		if(s=="quit"|| s=="q"|| s=="Q") break;
		else if(s=="s" || s=="S" ||s=="start") {merge_sort();break;}
	}
	end();
	system("pause"); 
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

糖果天王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值