(1) 将一个序列分成很多个子序列,将各个子序列分别排序后再将子序列合并
/*
归并排序:
将一个序列分成很多个子序列,分别将子序列进行排序,然后再将子序列合并
*/
#include<iostream>
#include<bits/stdc++.h>
#include<cmath>
using namespace std;
//将子序列a[first~mid] a[mid,last]合并
void merge(int a[] , int first ,int last)
{
int* temp= new int[last-first+1];
int i=first,mid=(first+last+1)/2,k=0,m=mid;
while(i<mid && m<=last){
if(a[i]<=a[m]) temp[k++]=a[i++];
else temp[k++]=a[m++];
}
// 前一个子序列长度更长时
while(i<mid) temp[k++] = a[i++];
//后一个子序列长度更长时
while(m<=last) temp[k++] = a[m++];
int cnt=0;
for(int j=first;j<=last;j++) a[j] = temp[cnt++];
delete[] temp;
}
void mergesort(int a[], int first , int last )
{
if(last-first==0) return; // 递归出口
else{
int mid = (first+last+1)/2;
mergesort(a,first,mid-1) ; //归并排序前半个子序列
mergesort(a,mid,last) ; //归并排序后半个子序列
merge(a,first,last); //将两个已排序的子序列合并
}
}
int main()
{
int n;
cin >> n;
int number[n];
srand((int)time(NULL)); //每次执行种子不同,生成不同的随机数
for(int i=0;i<n;i++)
{
number[i] = rand() % 10;
}
mergesort(number,0,n-1);
for(int i=0;i<n;i++){
cout << number[i] << endl;
}
return 0;
}