PAT1098【插入排序+堆排序】
简单插入排序:
简单插入排序的核心思想:
把一条这么个难看的序列默认分为两个排好序的和未排好序的两个部分;
所以一开始排好序的只有一个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;
}PAT1098【插入排序+堆排序】的更多相关文章
- Introsort(内观排序)
.NET 4.5 这个版本的Array.Sort更改了STL的内观排序算法,那相对于快速排序内观排序到底有什么优化过的呢? 根据维基百科所说,这个排序算法首先从快速排序开始,当递归深度超过一定深度(深 ...
- FCL源码中数组类型的学习及排序函数Sort函数的分析
Array 是所有数组的基类ArrayList 解决了所有Array 类的缺点 能动态扩容, 但是类型不安全的,而是会有装箱与拆箱的性能开销List<T> 则是解决了ArrayLis ...
- C++笔试易错题集(持续更新)
1.如下代码输出结果是什么? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #include<stdio.h> char *myString() { ...
- STL的sort函数是使用什么排序算法的?
先占坑,大概就是主要快速排序+插入排序+堆排序的合体
- [Web 前端] 004 html 小练习
1. 锚点 用法 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> < ...
- .NET 排序 Array.Sort<T> 实现分析
System.Array.Sort<T> 是.NET内置的排序方法, 灵活且高效, 大家都学过一些排序算法,比如冒泡排序,插入排序,堆排序等,不过你知道这个方法背后使用了什么排序算法吗? ...
- 浅谈C++之冒泡排序、希尔排序、快速排序、插入排序、堆排序、基数排序性能对比分析之后续补充说明(有图有真相)
如果你觉得我的有些话有点唐突,你不理解可以想看看前一篇<C++之冒泡排序.希尔排序.快速排序.插入排序.堆排序.基数排序性能对比分析>. 这几天闲着没事就写了一篇<C++之冒泡排序. ...
- IOS- 快速排序,冒泡排序,直接插入排序和折半插入排序,希尔排序,堆排序,直接选择排序
/*******************************快速排序 start**********************************///随即取 当前取第一个,首先找到第一个的位置 ...
- Javascript中的冒泡排序,插入排序,选择排序,快速排序,归并排序,堆排序 算法性能分析
阿里面试中有一道题是这样的: 请用JavaScript语言实现 sort 排序函数,要求:sort([5, 100, 6, 3, -12]) // 返回 [-12, 3, 5, 6, 100],如果你 ...
随机推荐
- Java之泛型深解
泛型的内容确实很多,在上一篇Java之泛型浅解讲到了一些常用的泛型,但是还远远不够,上一篇的内容比较容易理解,这一篇我自己觉得更加难理解一些,因此,我还得想办法让它更加接地气更加容易理解,方便我和源宝 ...
- Idea_学习_01_Idea激活
一.激活—激活码 下载地址:官网 1.注册码 http://idea.lanyus.com/ 二.激活—license server 1. (推荐) 弹窗中选择最后一个页面license server ...
- freeMarker(五)——模板开发指南补充知识
学习笔记,选自freeMarker中文文档,译自 Email: ddekany at users.sourceforge.net 模板开发指南补充知识 1. 自定义指令 自定义指令可以使用 macro ...
- D唐纳德和他的数学老师(华师网络赛)(二分匹配,最大流)
Time limit per test: 1.0 seconds Memory limit: 256 megabytes 唐纳德是一个数学天才.有一天,他的数学老师决定为难一下他.他跟唐纳德说:「现在 ...
- innerdb disable error
innodb=OFF ignore-builtin-innodb skip-innodbdefault-storage-engine=myisam default-tmp-storage-engine ...
- Popular Cows
传送门(poj):http://poj.org/problem?id=2186 (bzoj):http://www.lydsy.com/JudgeOnline/problem.php?id=1051 ...
- Django 发布
0.完成好 Django 项目,做部署前准备,比如 settings.py 改 debug 什么的. 1.用 Gunicorn 部署 Django 项目,相当于部署 Java Web 的 Tomcat ...
- python中http请求中添加cookie支持
python3中构造http的Request需要用到urllib.request. 有时会用到cookie. 比如在访问网站首页得到cookie,通过下面代码添加cookie: #insta ...
- debian上安装codeblocks
1.查看linux的版本uname -a 2.在官网上下载稳定版的codeblocks(www.codeblocks.org) 3.解压codeblocks后,进入到文件夹中用root身份执行dpkg ...
- C#某月的第一天和最后一天
1.本月的第一天===>DateTime.Now.AddDays(1 - DateTime.Now.Day);//当前日期减去当前日期和本月一号相差天数 2.本月的最后一天===>Date ...