啊之前在大学MOOC上排序的时候课后作业就是这个 一直没写 然后按部就班刷题刷到这里了
自己辣鸡的思路:排一趟比较一趟,插入确实可以这样!但是归并在电脑上的实行机制不是想象中的那样的!!!!在电脑上是把左边全部排完再排右边,所以这个方法行不通,所以归并这里需要修改
小姐姐的思路:点击打开链接
第一:先遍历一遍B数组,找到还未交换的那个数(即前面比后面大的那个数),i赋值为这个数的位置
第二:从这个数后面一个数开始遍历,判断a数组和b数组是否相等,如果相等j++
第三:判断 j是否等于n
如果相等则是插入排序
不相等则是归并排序
第四:对于插入排序
sort(a,a+i+2)
第五:归并排序
两个两个排
到四个四个排
到八个八个排
int k=1;int flag= 1;while(flag){flag = 0;for(i=0;i<n;i++){if(a[i]!=b[i])flag = 1;} k = k*2;for(i=0;i<n/k;i++){sort(a+i*k,a+(i+1)*k,cmp);}sort(a+n/k*k,a+n,cmp);
完整code:
#include<iostream>
#include<algorithm>
using namespace std;
int cmp(int a,int b)
{return a<b;
} int main()
{int n;int i,j;cin >> n;int *a = new int [n];int *b = new int [n];for(i=0;i<n;i++){cin >> a[i];}for(i=0;i<n;i++){cin >> b[i];}for(i=0; i<n-1 && b[i]<=b[i+1]; i++);//找到还未交换的那个数 //cout << i << endl<< endl; for(j=i+1;a[j]==b[j] && j<n;j++);//判断这个数后面的是否跟初始数字相等
// cout << j << endl;if(j==n)//如果相等是插入排序 {cout << "Insertion Sort" << endl;sort(a,a+i+2,cmp);}else{cout << "Merge Sort" << endl;int k=1;int flag= 1;while(flag){flag = 0;for(i=0;i<n;i++){if(a[i]!=b[i])flag = 1;} k = k*2;// cout << k << endl << endl;for(i=0;i<n/k;i++){//cout << i*k << " " << (i+1)*k <<"memeda" <<endl;sort(a+i*k,a+(i+1)*k,cmp);}// for(j=0;j<n;j++)
// {
// cout << a[j] << " ";
// }
// cout << endl;sort(a+n/k*k,a+n,cmp);//cout << n/k*k <<n <<endl;}}for(j=0;j<n-1;j++){cout << a[j] << " ";}cout << a[n-1];delete [] a;delete [] b;return 0;
}