A1098 Insertion or Heap Sort (25分)
一、技术总结
- 这是一道考查插入排序和堆排序的问题。
- 这里开始最主要的问题是,没有理解堆排序。堆排序是通过把数组中第一个元素与最后一个元素交换,然后再对于第一个元素进行向下调整downAdjust函数。
- 所以这里对于插入排序,只要一直遍历发现第一个元素的比前一个元素小,记录下这时的下标。然后同时后面的元素与原数组相同,那么就是插入排序。
- 对于堆排序怎么知道到哪一步,根据堆排序的特点知道。是通过从后往前交换元素,然后使用downAdjust函数调整,所以要判断,就从后往前判断,如果出现当前元素,比首位元素小,说明排序进行到此处。
二、参考代码
#include<bits/stdc++.h>
using namespace std;
void downAdjust(vector<int> &b, int low, int high){
int i = 1, j = 2*i;
while(j <= high){
if(j+1 <= high && b[j] < b[j+1]){
j = j + 1;
}
if(b[i] < b[j]){
swap(b[i], b[j]);
i = j;
j = i*2;
}else{
break;
}
}
}
int main(){
int n, p = 2;
scanf("%d", &n);
vector<int> a(n+1), b(n+1);
for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
for(int i = 1; i <= n; i++) scanf("%d", &b[i]);
while(p <= n && b[p-1] <= b[p]) p++;
int index = p;
while(p <= n && a[p] == b[p]) p++;
if(p == n+1){
printf("Insertion Sort\n");
sort(b.begin()+1, b.begin()+index+1);
}else{
printf("Heap Sort\n");
p = n;
while(p > 2 && b[p] >= b[1]) p--;
swap(b[1], b[p]);
downAdjust(b, 1, p-1);
}
printf("%d", b[1]);
for(int i = 2; i <= n; i++){
printf(" %d", b[i]);
}
return 0;
}
作者:睿晞
身处这个阶段的时候,一定要好好珍惜,这是我们唯一能做的,求学,钻研,为人,处事,交友……无一不是如此。
劝君莫惜金缕衣,劝君惜取少年时。花开堪折直须折,莫待无花空折枝。
曾有一个业界大牛说过这样一段话,送给大家:
“华人在计算机视觉领域的研究水平越来越高,这是非常振奋人心的事。我们中国错过了工业革命,错过了电气革命,信息革命也只是跟随状态。但人工智能的革命,我们跟世界上的领先国家是并肩往前跑的。能身处这个时代浪潮之中,做一番伟大的事业,经常激动的夜不能寐。”
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.