和插入和归并那道题差不多,新学交换元素技能,虽然没什么软用
#include<stdio.h>
#include<stdlib.h>
#include<limits.h>
#include<math.h>
#pragma warning(disable:4996)
using namespace std;
int main()
{
int N;
int *a, *b;
scanf("%d", &N);
a = (int *)malloc(sizeof(int)*N);
b = (int *)malloc(sizeof(int)*N);
for (int t = 0;t < N;t++)
scanf("%d", a + t);
for (int t = 0;t < N;t++)
scanf("%d", b + t);
int high = N - 1;
while (high >= 0)//从后往前寻找第一个两个数列同一位置值不同的位置
{
if (a[high] == b[high]) high--;
else break;
}
int flag = 0;
for (int t = 1;t <= high;t++)//若此位置前面都有序,则为插入排序
if (b[t] < b[t - 1]) {
flag = 1;break;
}
if (flag) {
printf("Heap Sort\n");
int high;
for (int t = 1;t < N;t++)
if (b[t] >= b[0]) { high = t;break; }
high--;
b[high] = b[0] ^ b[high];b[0] = b[0] ^ b[high];b[high] = b[0] ^ b[high];//交换b[0]和b[high]
int low = 0;
while ((low + 1) * 2 - 1 < high)
{
int m = low;
if (b[(low + 1) * 2 - 1] > b[m]) m = (low + 1) * 2 - 1;
if ((low + 1) * 2<high && b[(low + 1) * 2]>b[m]) m = (low + 1) * 2;
if (m == low) break;
b[low] = b[low] ^ b[m];b[m] = b[low] ^ b[m];b[low] = b[low] ^ b[m];//交换
low = m;
}
printf("%d", b[0]);
for (int t = 1;t < N;t++)
printf(" %d", b[t]);
}
else {
printf("Insertion Sort\n");
while (b[high + 1] > b[high]) high++;//题目不严谨的地方
for (;high >= 0;high--)//继续插排的下一步
if (b[high + 1]<b[high]) {
int tem = b[high];
b[high] = b[high + 1];
b[high + 1] = tem;
}
else break;
for (int t = 0;t < N;t++)//输出
{
printf("%d", b[t]);
if (t != N - 1) putchar(' ');
}
}
putchar('\n');
}