简单插入排序:

简单插入排序的核心思想:

把一条这么个难看的序列默认分为两个排好序的和未排好序的两个部分;

所以一开始排好序的只有一个a[0](好看的只有一个),难看的有N(数组长度)-1个a[1,n-1];

然后呢,你就要顺序下来,把一个个难看的几个人插到好看的那一堆里去,好看的越来越多,难看的越来越少,最后变成了真的好看的;
代码:

void InsertionSort(int a[],int n)   //a[]是要处理的数组,n是数组长度
{int i,j;int temp;//默认两部分,一部分好看,一部分难看;//把难看的解决就好了 for(i=1;i<=n-1;i++) //有n-1个难看的{temp=a[i];for(j=i-1;j>=0;j--) {if(a[j]<temp)   //这个难看孩子在好看的位置,就是前面那个比他小的时候break;a[j+1]=a[j];}a[j+1]=temp;    //比他小的好看孩子的后面一个啊;就算最小的还比他大,j传出来会变成-1,j+1就是0了 }
}

堆排序:

堆排序的思想:

利用最大堆(最小堆)输出堆顶元素,即最大值(或最小值),将剩下的元素重新生成最大堆(或者最小堆),一直重复这个过程,直到所有的元素输出。

我们来学习一个开辟O(1)空间就能办事的堆排序。

其实很简单,就是把最大堆(或者最小堆)与它最后一个元素交换,然后重新建立最大堆。

代码主要做的事情就是:“向下过滤”,所以我们把这部分代码拿出来。

void Adjust(int a[], int i, int n)
{  int c,temp;  for(temp=a[i];(2*i+1)<n;i=c)  {  c=2*i+1;  if(c!=n-1&&a[c+1]>a[c])  c=c+1;  if(temp<a[c]) a[i]=a[c];  else break;  }  a[i] = temp;
}  

然后开始写堆排序的步骤代码:

void Build(int a[],int n)
{for(int i=(n-1)/2;i>=0;i--)//从有儿子的最后一个结点开始向下过滤 Adjust(a,i,n);
}

然后就是一个交换:

void Exchange(int a[],int n)
{for(i = n - 1; i > 0; i--){temp = a[0];a[0] = a[i];a[i] = temp;//交换Adjust(a, 0, i);//将交换的新a[0]向下过滤一下得到最大堆}
}

题目代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAXN=1e2+10;bool Check(int a[],int b[],int n)
{for(int i=0;i < n;i++)if(a[i]!=b[i]) return false;return true;
}//第 i 个元素向下过滤;
void Adjust(int a[], int i, int n)
{int c,temp;for(temp=a[i];(2*i+1)<n;i=c){c=2*i+1;if(c!=n-1&&a[c+1]>a[c])c=c+1;if(temp<a[c]) a[i]=a[c];else break;}a[i] = temp;
}bool HeapSort(int a[], int n,int b[])
{int c,i,temp;//建立最大堆 for(i = (n-1)/2; i >= 0; i--)    //从含有儿子节点的根开始。 Adjust(a, i, n);//然后依次交换。 for(i = n - 1; i > 0; i--){temp = a[0];a[0] = a[i];a[i] = temp;Adjust(a, 0, i);if(Check(a,b,n)){i--;temp = a[0];a[0] = a[i];a[i] = temp;Adjust(a, 0, i); puts("Heap Sort");for(int k=0;k<n;k++){if(k) printf(" ");printf("%d",a[k]);}return true;}}return false;
}bool InsertionSort(int a[],int b[],int n)
{int temp,i,j;for(i=1;i<=n-1;i++){temp=a[i];for(j=i-1;j>=0;j--){if(a[j]<temp) break;a[j+1]=a[j];}a[j+1]=temp;if(Check(a,b,n)){i++;    temp=a[i];for(j=i-1;j>=0;j--){if(a[j]<temp) break;a[j+1]=a[j];}a[j+1]=temp;puts("Insertion Sort");for(int k=0;k<n;k++){if(k) printf(" ");printf("%d",a[k]);}return true;}}return false;
}int main()
{int n;int a[MAXN],b[MAXN],c[MAXN];scanf("%d",&n);for(int i=0;i<n;i++){scanf("%d",&a[i]);c[i]=a[i];}for(int i=0;i<n;i++)scanf("%d",&b[i]);if(InsertionSort(a,b,n))return 0;if(HeapSort(c,n,b))return 0;
}

转载于:https://www.cnblogs.com/keyboarder-zsq/p/6777372.html

PAT1098【插入排序+堆排序】相关推荐

  1. 多态指针访问虚函数不能被继承的类快速排序N皇后问题插入排序堆排序merge归并排序栈上生成对象两个栈实现一个队列...

    多态 /*1. 要想实现覆盖(重写)父类必须声明为virtual,子类可以不声明为virtual.-->FunB()2. 派生类重写基类的虚函数实现多态,要求函数名.参数列表.返回值完全相同.( ...

  2. 1098 Insertion or Heap Sort (25 分)【难度: 中 / 插入排序 堆排序 堆排序不会未完成】

    https://pintia.cn/problem-sets/994805342720868352/problems/994805368847187968 堆排好久没写了不会写,有时间补

  3. ❤️万字总结八大排序:冒泡排序,选择排序,插入排序,堆排序,希尔排序,归并排序,计数排序❤️

    目录 主要排序算法性能对比 冒泡排序 选择排序 插入排序 堆排序 希尔排序 快速排序 Hoare版 挖坑版 前后指针法 归并排序 计数排序 海量数据的排序问题 主要排序算法性能对比 冒泡排序 各位同学 ...

  4. .NET 排序 Array.SortT 实现分析

    System.Array.Sort<T> 是.NET内置的排序方法, 灵活且高效, 大家都学过一些排序算法,比如冒泡排序,插入排序,堆排序等,不过你知道这个方法背后使用了什么排序算法吗? ...

  5. c语言getchar_二级C语言试题刷题录

    2020.9 计算机二级C语言科目 选择题 标黑的为正确选项 程序流程图中带有箭头的线段表示的是 ==控制流== 图元关系.数据流.调用关系 当图为数据流图的时候,标有名字的箭头表示数据流 结构化程序 ...

  6. .NET 排序 Array.Sort<T> 实现分析

    System.Array.Sort<T> 是.NET内置的排序方法, 灵活且高效, 大家都学过一些排序算法,比如冒泡排序,插入排序,堆排序等,不过你知道这个方法背后使用了什么排序算法吗? ...

  7. [笔试面试题] 9-数据结构与算法篇

    1 出栈&入栈问题 正确答案是:AB 解析如下: 首先,入栈与出栈是交错进行的,也就是A入栈后可能立马就出栈了.也可能A.B都入栈后,再让B出栈. 选项A:A入,B入,C入,D入,E入.想要出 ...

  8. 理解快速排序 | 打通算法学习的任督二脉

    本文作者胡光 前百度高级算法研发工程师,ACM 国际大学生程序设计大赛亚洲区金牌获得者 具体内容来自他在极客时间开设的免费公开课<常用算法 25 讲> 排序算法在工作中最常用,也是学习很多 ...

  9. 排序方法基本介绍(1)

    第三次博客:排序方法基本介绍(1): 稳定的 冒泡排序(bubble sort) - O(n^2) 鸡尾酒排序(Cocktail sort,双向的冒泡排序) - O(n^2) 插入排序(inserti ...

最新文章

  1. stdout和stderr标准输出的区别
  2. 3.1 《数据库系统概论》SQL概述及数据定义(模式SCHEMA、表TABLE、索引INDEX)
  3. Python程序每日一练习
  4. 美团点评技术年货:一本覆盖各技术领域、1200+页的电子书
  5. CodeForces 869E The Untended Antiquity 二维树状数组,随机hash
  6. 入门机器学习(十)--课后作业解析-神经网络(Python实现)
  7. SparkSQL高并发:读取存储数据库
  8. VI命令详解(大全)
  9. Improving Opencv11 Extract horizontal and vertical lines by using morphological operations
  10. 简述 Polkadot 和区块链互联网
  11. 【卫星】卫星通信基本概念与知识
  12. python爬取b站_python3 爬取B站视频弹幕
  13. Google Chrome 启动 0x0000005 崩溃问题的解决方法
  14. ARP协议(2)ARP协议格式详解
  15. js鼠标移入改变颜色,移除还原
  16. 从MIT协议谈契约精神
  17. 设计模式 - 学习笔记 - 适配器模式AdapterPattern
  18. Rust学习记录 -> 线程之间的通道通信
  19. 职业也如学习一样,逆水行舟不进则退
  20. 转 全国高校信息数据库,全国高校排序数据库

热门文章

  1. [转]处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”...
  2. 上海立信会计学院_上海立信会计学院分数线_上海立信_立信会计_立信会计学院...
  3. Python中关于XML-RPC原理
  4. spring AoP学习 -----AoP织入器ProxyFactory剖析
  5. 日美“利刃”联合军演
  6. sqlite3 外键支持
  7. 克隆虚拟机后需要修改的注意项
  8. java 调用cpp_java jni 调用cpp文件中的方法 | 学步园
  9. python 删除文件、目录_python脚本删除文件及删除文件目录的方法
  10. 1594: TomCat的操作系统课(思维)