实验八 排序(插入排序、归并排序、快速排序)

发现一个不大不小的bug,每次第一种方法排完序后,第二、第三种排序时都是对已排好序的数组进行排序了。。

所以应该借助一下temp数组,第一、二种方法排完序后将A数组还原成一开始无序的状态,比较时间代码及运行结果未修改。

以下代码仅供参考

2019-1-3更新

---------------------------------------------------------------------------------------------------------------------

  • 测试数据的生成
  • 插入排序、归并排序、快速排序
  • 排序的时间比较

1、测试数据的生成

测试五组数据,数据规模分别是100,1000,10000,100000,1000000,数据范围均为[0,10000000];

//CSDN博客:https://blog.csdn.net/qq_40889820
#include<iostream>
#include<sstream>
#include<fstream>
#include<algorithm>
#include<string>
#include<cstring>
#include<iomanip>
#include<vector>
#include<cmath>
#include<ctime>
#include<stack>
#include<queue>
#include<map>
#define mem(a,b) memset(a,b,sizeof(a))
#define random(a,b) (rand()%(b-a+1)+a)
#define e 2.71828182
#define Pi 3.141592654
using namespace std;
int main()
{
	ofstream outfile1("100.txt",ios::out);
	ofstream outfile2("1K.txt",ios::out);
	ofstream outfile3("10K.txt",ios::out);
	ofstream outfile4("100K.txt",ios::out);
	ofstream outfile5("1M.txt",ios::out);
	srand((unsigned)time(NULL));
	for(int i=0;i<100;i++)//100个数据 
	{
		int a=random(0,10000000);
		outfile1<<a<<' ';
	}
	for(int i=0;i<1000;i++)//1000个数据 
	{
		int a=random(0,10000000);
		outfile2<<a<<' ';
	}
	for(int i=0;i<10000;i++)//10000个数据 
	{
		int a=random(0,10000000);
		outfile3<<a<<' ';
	}
	for(int i=0;i<100000;i++)//100000个数据 
	{
		int a=random(0,10000000);
		outfile4<<a<<' ';
	}
	for(int i=0;i<1000000;i++)//1000000个数据 
	{
		int a=random(0,10000000);
		outfile5<<a<<' ';
	}
	cout<<"success!";
}

2、三种排序

归并排序和快速排序是分治策略的典型应用。

   比较情况     插入排序    归并排序   快速排序
   最佳情况       \Theta (n)\Theta (nlog_2n)\Theta (nlog_2n)
   平均情况       \Theta (n^{2})\Theta (nlog_2n)\Theta (nlog_2n)
   最差情况       \Theta (n^{2})\Theta (nlog_2n)    \Theta (n^{2})

插入排序:

void swap(int& a,int& b)//变换变量a,b值 
{
	a=b-a+(b=a); 
}
void InSort(int A[],int n)//对数组A[0,n-1]进行插入排序 
{
	for(int i=1;i<n;i++)
	{
		for(int j=i;j>0;j--)
		{
			if(A[j]<A[j-1])
			swap(A[j],A[j-1]);	
                        else break;
		}	
	} 
}

归并排序:

void MergeSort(int A[],int temp[],int left,int right)//对数组A[left,right]归并排序,temp为辅助数组 
{
	if(left<right)
	{
		int mid=(left+right)/2;
		MergeSort(A,temp,left,mid);
		MergeSort(A,temp,mid+1,right);
		//将A数组拷贝至temp数组 
		for(int i=left;i<=right;i++)
			temp[i]=A[i];
		//归并
		int p1=left,p2=mid+1,p=left;
		while(p1<=mid&&p2<=right)
		{
			if(temp[p1]<temp[p2])
				A[p++]=temp[p1++];
			else A[p++]=temp[p2++];	
		} 
		while(p1<=mid) A[p++]=temp[p1++];
		while(p2<=right) A[p++]=temp[p2++];
	}
}

快速排序:

void swap(int& a,int& b)//变换变量a,b值 
{
	a=b-a+(b=a); 
}
void QuickSort(int A[],int left,int right)//对数组A[left,right]快速排序 
{
	if(left>=right) return;
	int k=A[(left+right)/2];//以数组中间值为轴值 
        swap(A[left],A[(left+right)/2]);
	int i=left,j=right;
	while(i!=j)
	{
		while(j>i&&A[j]>=k)
			--j;
		swap(A[i],A[j]);
		while(j>i&&A[i]<=k)
			++i;
		swap(A[i],A[j]);
	}
	QuickSort(A,left,i-1);
	QuickSort(A,i+1,right); 
}

三、排序时间比较

int A[1000000],temp[1000000];
int main()
{
	for(int i=1;i<=55;i++) cout<<'*';
        cout<<"\n 实验八:排序算法的比较(插入排序、归并排序、快速排序)\n";
	for(int i=1;i<=55;i++) cout<<'*';
	cout<<endl;
	ifstream infile1("100.txt",ios::in);
	ifstream infile2("1K.txt",ios::in);
	ifstream infile3("10K.txt",ios::in);
	ifstream infile4("100K.txt",ios::in);
	ifstream infile5("1M.txt",ios::in);
	if(!infile1||!infile2||!infile3||!infile4||!infile5)
	{
		cout<<"open error!\n";
		return 0;
	}
	clock_t t;
	//100个数据 
	for(int i=0;i<100;i++)	
	infile1>>A[i];
	t=clock();
	InSort(A,100);
	t=clock()-t;
	cout<<"对100个数据插入排序的时间为:"<<(((float)t)/CLOCKS_PER_SEC*1000)<<"ms\n"; 
	t=clock();
	MergeSort(A,temp,0,100-1);
	t=clock()-t;
	cout<<"对100个数据归并排序的时间为:"<<(((float)t)/CLOCKS_PER_SEC*1000)<<"ms\n"; 
	t=clock();
	QuickSort(A,0,100-1);
	t=clock()-t;
	cout<<"对100个数据快速排序的时间为:"<<(((float)t)/CLOCKS_PER_SEC*1000)<<"ms\n"; 
	cout<<endl;
	//1000个数据 
	for(int i=0;i<1000;i++)
	infile2>>A[i];
	t=clock();
	InSort(A,1000);
	t=clock()-t;
	cout<<"对1000个数据插入排序的时间为:"<<(((float)t)/CLOCKS_PER_SEC*1000)<<"ms\n"; 
	t=clock();
	MergeSort(A,temp,0,1000-1);
	t=clock()-t;
	cout<<"对1000个数据归并排序的时间为:"<<(((float)t)/CLOCKS_PER_SEC*1000)<<"ms\n";
	t=clock();
	QuickSort(A,0,1000-1);
	t=clock()-t;
	cout<<"对1000个数据快速排序的时间为:"<<(((float)t)/CLOCKS_PER_SEC*1000)<<"ms\n"; 
	cout<<endl; 
	//10000个数据 
	for(int i=0;i<10000;i++)
	infile3>>A[i];
	t=clock();
	InSort(A,10000);
	t=clock()-t;
	cout<<"对10000个数据插入排序的时间为:"<<(((float)t)/CLOCKS_PER_SEC*1000)<<"ms\n"; 
	t=clock();
	MergeSort(A,temp,0,10000-1);
	t=clock()-t;
	cout<<"对10000个数据归并排序的时间为:"<<(((float)t)/CLOCKS_PER_SEC*1000)<<"ms\n"; 
	t=clock();
	QuickSort(A,0,10000-1);
	t=clock()-t;
	cout<<"对10000个数据快速排序的时间为:"<<(((float)t)/CLOCKS_PER_SEC*1000)<<"ms\n"; 
	cout<<endl;
	//100000个数据 
	for(int i=0;i<100000;i++)
	infile4>>A[i];
	t=clock();
	InSort(A,100000);
	t=clock()-t;
	cout<<"对100000个数据插入排序的时间为:"<<(((float)t)/CLOCKS_PER_SEC*1000)<<"ms\n"; 
	t=clock();
	MergeSort(A,temp,0,100000-1);
	t=clock()-t;
	cout<<"对100000个数据归并排序的时间为:"<<(((float)t)/CLOCKS_PER_SEC*1000)<<"ms\n"; 
	t=clock();
	QuickSort(A,0,100000-1);
	t=clock()-t;
	cout<<"对100000个数据快速排序的时间为:"<<(((float)t)/CLOCKS_PER_SEC*1000)<<"ms\n"; 
	cout<<endl;
	//1000000个数据 
	for(int i=0;i<1000000;i++)
	infile5>>A[i];
	t=clock();
	InSort(A,1000000);
	t=clock()-t;
	cout<<"对1000000个数据插入排序的时间为:"<<(((float)t)/CLOCKS_PER_SEC*1000)<<"ms\n"; 
	t=clock();
	MergeSort(A,temp,0,1000000-1);
	t=clock()-t;
	cout<<"对1000000个数据归并排序的时间为:"<<(((float)t)/CLOCKS_PER_SEC*1000)<<"ms\n"; 
	t=clock();
	QuickSort(A,0,1000000-1);
	t=clock()-t;
	cout<<"对1000000个数据快速排序的时间为:"<<(((float)t)/CLOCKS_PER_SEC*1000)<<"ms\n"; 
}

运行结果(等了一个多小时〒▽〒)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值