1098. Insertion or Heap Sort (25)

来源:互联网 发布:现货黄金分时买卖源码 编辑:程序博客网 时间:2024/06/05 23:45

1.之前一直开在测试点2里,通过实验知道0、2、4测试点是测插入排序的,1、3、5是堆排的。

2.测试点2卡住,主要是因为插入排序的外层循环我从i=0开始,导致第一步出来的结果和原来的一模一样(i=0,相当于没有进行调整),而把i改为1后,则可以正常AC题目

3.目前只知道测试点2的情况是,经过若干轮插入排序后,得到的target数组与源数组是一样的,其他细节就无从得知

4.堆排的程序:

#define LeftChild(i) (2*(i)+1)void PercDown(vector<int>&num, int i, int n){int child;int tmp;for (tmp = num[i]; LeftChild(i) < n; i = child){child = LeftChild(i);if (child != n - 1 && num[child + 1] > num[child])child++;if (tmp < num[child])num[i] = num[child];elsebreak;}num[i] = tmp;}for (int i = n - 1; i>0; i--){//进行堆排swap(numCopy[0], numCopy[i]);PercDown(numCopy, 0, i);}


AC代码:

//#include<string>//#include <iomanip>#include<vector>#include <algorithm>//#include<stack>#include<set>#include<queue>#include<map>//#include<unordered_set>#include<unordered_map>//#include <sstream>//#include "func.h"//#include <list>#include<stdio.h>#include<iostream>#include<string>#include<memory.h>#include<limits.h>using namespace std;/*106 4 5 1 0 3 2 7 8 95 4 2 1 0 3 6 7 8 9*/#define LeftChild(i) (2*(i)+1)void PercDown(vector<int>&num, int i, int n){int child;int tmp;for (tmp = num[i]; LeftChild(i) < n; i = child){child = LeftChild(i);if (child != n - 1 && num[child + 1] > num[child])child++;if (tmp < num[child])num[i] = num[child];elsebreak;}num[i] = tmp;}int main(void){int n;cin >> n;vector<int> num(n, 0);vector<int> num2(n, 0);vector<int> numCopy(n, 0);vector<int> target(n, 0);for (int i = 0; i < n; i++){scanf("%d", &num[i]);}numCopy = num;num2 = num;for (int i = 0; i < n; i++){scanf("%d", &target[i]);}bool isInsert = false;for (int i = 1; i < n; i++){//进行插入排序,从i=1,即第二个元素开始插入排序,i=0时,没必要进行插入排序(为什么测试点2会错?)int tmp = num[i];int j = i;for (; j>0 && num[j - 1]>tmp; j--){num[j] = num[j - 1];}num[j] = tmp;if (!isInsert && num == target){//是插入排序isInsert = true;}else if (isInsert){break;}}if (isInsert){cout << "Insertion Sort" << endl;for (int i = 0; i < n; i++){cout << num[i];if (i != n - 1)cout << " ";}cout << endl;return 0;}bool isHeap = false;for (int i = n / 2; i >= 0; i--)PercDown(numCopy, i, n);for (int i = n - 1; i>0; i--){//进行堆排swap(numCopy[0], numCopy[i]);PercDown(numCopy, 0, i);if (!isHeap && numCopy == target){isHeap = true;}else if (isHeap)break;//cout << "Heap Sort" << endl;//for (int i = 0; i < n; i++)//{//cout << numCopy[i];//if (i != n - 1)//cout << " ";//}}if (isHeap){//如果是堆排,输出并returncout << "Heap Sort" << endl;for (int i = 0; i < n; i++){cout << numCopy[i];if (i != n - 1)cout << " ";}cout << endl;return 0;}return 0;}

0 0
原创粉丝点击