A1098 Insertion or Heap Sort (25分)(堆排序和插入排序)
一、技术总结
- 这一题是关于堆排序和插入排序的问题,首先是要理解这两个排序的原理,对于插入排序,是对于序列的前一部分默认为有序,然后从后面开始依次往前进行比较,插入到合适的位置上,排序过程中,序列的特征是,前面的是从小到大的,但是后面的部分,与原来的序列应该是相同的;
void insertSort{
for(int i = 2; i <= n; i++){
int temp = A[i], j = i;
while(j >= 1 && A[j] < A[j - 1]){
A[j] = A[j - 1];
j--;
}
A[j] = temp;
}
- 关于堆排序,每次排序是将堆顶元素放置到序列末尾,然后进行一次向下调整,所以序列特征是,末尾的元素是从小到大的,堆顶一定是没有排序的中元素最大值;
二、参考代码
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int MAXV = 105;
int origin[MAXV], sor[MAXV];
void downAjust(int low, int high){
int i = low, j = 2 * i;
while(j <= high){
if(j + 1 <= high && sor[j] < sor[j + 1]){
j = j + 1;
}
if(sor[i] < sor[j]){
swap(sor[i], sor[j]);
i = j;
j = 2 * i;
}else{
break;
}
}
}
int main(){
int n, p = 2;
cin >> n;
for(int i = 1; i <= n; i++){
scanf("%d", &origin[i]);
}
for(int i = 1; i <= n; i++){
scanf("%d", &sor[i]);
}
while(p <= n && sor[p - 1] <= sor[p]) p++;
int index = p;
while(p <= n && origin[p] == sor[p]) p++;
if(p == n + 1){
printf("Insertion Sort\n");
sort(sor + 1, sor + index + 1);
}else{
printf("Heap Sort\n");
p = n;
while(p > 2 && sor[p] >= sor[1]) p--;
swap(sor[1], sor[p]);
downAjust(1, p - 1);
}
printf("%d", sor[1]);
for(int i = 2; i <= n; i++){
printf(" %d", sor[i]);
}
return 0;
}
作者:睿晞
身处这个阶段的时候,一定要好好珍惜,这是我们唯一能做的,求学,钻研,为人,处事,交友……无一不是如此。
劝君莫惜金缕衣,劝君惜取少年时。花开堪折直须折,莫待无花空折枝。
曾有一个业界大牛说过这样一段话,送给大家:
“华人在计算机视觉领域的研究水平越来越高,这是非常振奋人心的事。我们中国错过了工业革命,错过了电气革命,信息革命也只是跟随状态。但人工智能的革命,我们跟世界上的领先国家是并肩往前跑的。能身处这个时代浪潮之中,做一番伟大的事业,经常激动的夜不能寐。”
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.