题意:找出给定序列是什么排序,并给出下一步的排序
这题学习了归并排序,采用迭代进行划分区间。
void mergeSort(int *arr, int*partial, int size) {
//折半划分——不行
//按步长划分
//划分
int d=1;
int *tmp=new int[size];
while(d<size) {
for(int i=0; i<size; i+=2*d) {
int p1=i;
int p2=i+d;
int k=0;
int p1_len=i+d >size ? size: i+d;
int p2_len=i+2*d>size?size:i+2*d;
while(p1<p1_len && p2<p2_len) {
if(arr[p1] < arr[p2]) {
tmp[k]=arr[p1];
k++;
p1++;
} else {
tmp[k]=arr[p2];
k++;
p2++;
}
}
while(p1<p1_len) {
tmp[k]=arr[p1];
k++;
p1++;
}
while(p2<p2_len) {
tmp[k]=arr[p2];
k++;
p2++;
}
for(int j=0; j<k; j++) {
arr[i+j]=tmp[j];
}
}
d*=2;
if(flag==2) {
break;
}
//经过一轮排序之后,进行检查
bool isChecked=true;
for(int i=0; i<size; i++) {
if(arr[i]!=partial[i]) {
isChecked=false;
break;
}
}
if(isChecked) {
flag=2;
//再进行一轮
}
}
}
完整代码
//1089 Insert or Merge
/**
找出给定序列是什么排序,并给出下一步
*/
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
int flag=0;
//模拟两种排序
void insertSort(int *initial, int *partial, int size) {
//插入排序
for(int i=1; i<size; i++) {
int t=initial[i];
int j=0;
for(; t>initial[j]; j++); //find place
for(int k=i; k>j; k--) {
initial[k]=initial[k-1];
}
initial[j]=t;
if(flag==1) {
//下一轮时
break;
}
//进行比对
bool isChecked=true;
for(int k=0; k<size; k++) {
if(initial[k] != partial[k]) {
isChecked=false;
break;
}
}
//比对成功
if(isChecked) {
//在进行一轮
flag=1; //insert sort
}
}
}
void mergeSort(int *arr, int*partial, int size) {
//折半划分——不行
//按步长划分
//划分
int d=1;
int *tmp=new int[size];
while(d<size) {
for(int i=0; i<size; i+=2*d) {
int p1=i;
int p2=i+d;
int k=0;
int p1_len=i+d >size ? size: i+d;
int p2_len=i+2*d>size?size:i+2*d;
while(p1<p1_len && p2<p2_len) {
if(arr[p1] < arr[p2]) {
tmp[k]=arr[p1];
k++;
p1++;
} else {
tmp[k]=arr[p2];
k++;
p2++;
}
}
while(p1<p1_len) {
tmp[k]=arr[p1];
k++;
p1++;
}
while(p2<p2_len) {
tmp[k]=arr[p2];
k++;
p2++;
}
for(int j=0; j<k; j++) {
arr[i+j]=tmp[j];
}
}
d*=2;
if(flag==2) {
break;
}
//经过一轮排序之后,进行检查
bool isChecked=true;
for(int i=0; i<size; i++) {
if(arr[i]!=partial[i]) {
isChecked=false;
break;
}
}
if(isChecked) {
flag=2;
//再进行一轮
}
}
}
int main() {
int N;
cin>>N;
int *initial=new int[N];
int *initial2=new int[N];
for(int i=0; i<N; i++) {
int num;
cin>>num;
initial[i]=num;
initial2[i]=num;
}
int *target=new int[N];
for(int i=0; i<N; i++) {
int num;
cin>>num;
target[i]=num;
}
insertSort(initial,target,N);
mergeSort(initial2,target,N);
if(flag==1) {
printf("Insertion Sort\n");
for(int i=0; i<N; i++) {
if(i>0)printf(" ");
printf("%d",initial[i]);
}
} else if(flag==2) {
printf("Merge Sort\n");
for(int i=0; i<N; i++) {
if(i>0)printf(" ");
printf("%d",initial2[i]);
}
}
return 0;
}