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],如果你 ...
随机推荐
- 在Win8.1系统下如何安装运行SQL Server 2005
按正常情况,在Win8/Win8.1系统下安装微软的SQL Server 2005套件会存在兼容问题,即使安装完,最后的结果就是导致其服务项无法正常启动. 如果用户创建使用的项目非要按照SQL Ser ...
- 关于IDT报错乱码总结
可算是把我折腾坏了.一筹莫展.最后才把这些问题搞好.有些事不知道做以前,怎么都想不到.发现了方法之后,原来也不过这样.我觉得自己记性太差.还是好好写下来吧.写下来顺便会帮我重新再梳理一遍.原先乱码是因 ...
- 关于CString与VARIANT(CComVariant)之间的转化
一.VARIANT.CComVariant类与CString是什么: CString是MFC定义的字符串类,VARIANT是COM标准为了使COM组件能够被各种语言使用(vc++.vb.java.py ...
- Android: 利用SurfaceView绘制股票滑动直线解决延迟问题
1.背景介绍 最近项目要绘制股票走势图,并绘制能够跟随手指滑动的指示线(Indicator)来精确查看股票价格和日期.如下图所示: 上图中的那条白色直线就是股票的指示线,用来跟随手指精确确定股票的时间 ...
- CodeForces - 1017E :The Supersonic Rocket (几何+KMP,判定凸包是否同构)
After the war, the supersonic rocket became the most common public transportation. Each supersonic r ...
- Java面试题10(如何取到set集合的第一个元素)
1.如何取到set集合的第一个元素. public static void main(String[] args) { Set set = new HashSet(); set.add("x ...
- ACM学习历程—UESTC 1226 Huatuo's Medicine(数学)(2015CCPC L)
题目链接:http://acm.uestc.edu.cn/#/problem/show/1226 题目就是构造一个对称的串,除了中间的那个只有1个,其余的两边都是对称的两个,自然答案就是2*n-1. ...
- bzoj 4504: K个串 可持久化线段树+堆
题目: Description 兔子们在玩k个串的游戏.首先,它们拿出了一个长度为n的数字序列,选出其中的一 个连续子串,然后统计其子串中所有数字之和(注意这里重复出现的数字只被统计一次). 兔子们想 ...
- bzoj 1355: Radio Transmission
题目大意: 求字符串的最短循环覆盖字符串 题解: 经典结论题: kmp \(ans = n - next[n]\) #include <cstdio> #include <cstri ...
- asp.net中日志框架Log4Net的使用
Log4Net是用来记录日志的,可以将程序运行过程中的信息输出到一些地方(文件.数据库.EventLog等),日志就是程序的黑匣子,可以通过日志查看系统的运行过程,从而发现系统的问题.日志的作用:将运 ...