问题描述:对一组乱序的数进行从小到大的排序
合并排序:将两个(或两个以上)有序表合并成一个新的有序表
算法思想:根据分治法的思想,我们可以将这组规模为n的数分解成两组规模为n/2的数,如果子数组中只有一个数则直接返回,否则继续对字数组进行合并排序。排好序后用一个合并函数将两组数合并即可。
伪代码:
void merge_sort(int a[],int left,int right){//数组a存的将排序的数,left指向数组第一个元素,right指向数组最后一个元素
if(left==right)//当数组最后一个等于第一个元素,表示数组只有一个元素时
return;
if(left<right){
int mid=(left+right/2);//根据中间值将数组分为两部分,并对这两部分调用合并排序算法
merge_sort(a,b,left,mid);
merge_sort(a,b,mid+1,right);
merge(a,left,right);//合并两部分已排好序的数组
}
}
合并函数:
void merge(int a[],int left,int right){
int m=right-left+1;
int b[m],i=0,left0=left;
int mid=(left+right)/2,k=mid+1;
while((left<=mid)&&(k<=mid+1)){
if(a[left]<a[k]){
b[i++]=a[left++]
}
else{
b[i++]=a[k++];
}
}
if(left>mid)//若第二个序列有剩余
for(k;k<=right;k++)
b[i++]=a[k];
for(int j=0;j<m;j++){
a[left0++]=b[j];
}
}
产生随机数:
#include<iostream>
#include<fstream>
#include<stdlib.h>
#include<ctime>
using namespace std;
int main() {
srand(time(0));
ofstream output("input.txt");
int n;
cin>>n;
output<<n<<" ";
cout<<n<<" ";
for(int i=0;i<n;i++)
{
int k=rand()%(1000000-1+0)+0;
output<<k<<" ";
cout<<k<<" ";
}
return 0;
}
合并排序的代码:
#include<iostream>
#include<fstream>
#include <windows.h>
using namespace std;
void merge(int a[],int left,int right){//合并算法
int m=right-left+1;
int b[m],i=0,left0=left;
int mid=(left+right)/2,k=mid+1;
while((left<=mid)&&(k<=right)){
if(a[left]<a[k])
b[i++]=a[left++];
else
b[i++]=a[k++];
}
if(left>mid)//若第二个序列有剩余
for(k;k<=right;k++)
b[i++]=a[k];
if(k>right)//若第一个序列有剩余
for(left;left<=mid;left++)
b[i++]=a[left];
for(int j=0;j<m;j++)
a[left0++]=b[j];
}
void merge_sort(int a[],int left,int right){
if(left==right)
return;
if(left<right){
int mid=(left+right)/2;
merge_sort(a,left,mid);
merge_sort(a,mid+1,right);
merge(a,left,right);
}
}
int main()
{
ifstream input("input.txt");
if(!input)
cout<<"打开失败!";
ofstream output("output.txt");
int n;
input>>n;
int a[n];
cout<<"待排序的数为:"<<endl;
output<<"待排序的数为:"<<endl;
for(int i=0;i<n;i++){
input>>a[i];
cout<<a[i]<<" ";
output<<a[i]<<" ";
}
cout<<endl<<endl<<"排序结果:"<<endl;
output<<endl<<endl<<endl<<"排序结果:"<<endl;
LARGE_INTEGER BegainTime;
LARGE_INTEGER EndTime;
LARGE_INTEGER Frequency;
QueryPerformanceFrequency(&Frequency);
QueryPerformanceCounter(&BegainTime) ;
merge_sort(a,0,n-1);
QueryPerformanceCounter(&EndTime);
for(int j=0;j<n;j++)
cout<<a[j]<<" ";
for(int j=0;j<n;j++)
output<<a[j]<<" ";
cout<<endl<<endl<<"运行时间:"
<<(double)(EndTime.QuadPart-BegainTime.QuadPart)
<<"us"<<endl;
output<<endl<<endl<<"运行时间:"
<<(double)(EndTime.QuadPart-BegainTime.QuadPart)
<<"us"<<endl;
return 0;
}
时间复杂度分析: