简单插入排序:

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

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

所以一开始排好序的只有一个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【插入排序+堆排序】的更多相关文章

  1. Introsort(内观排序)

    .NET 4.5 这个版本的Array.Sort更改了STL的内观排序算法,那相对于快速排序内观排序到底有什么优化过的呢? 根据维基百科所说,这个排序算法首先从快速排序开始,当递归深度超过一定深度(深 ...

  2. FCL源码中数组类型的学习及排序函数Sort函数的分析

    Array 是所有数组的基类ArrayList 解决了所有Array 类的缺点    能动态扩容, 但是类型不安全的,而是会有装箱与拆箱的性能开销List<T> 则是解决了ArrayLis ...

  3. C++笔试易错题集(持续更新)

    1.如下代码输出结果是什么? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #include<stdio.h> char *myString() {     ...

  4. STL的sort函数是使用什么排序算法的?

    先占坑,大概就是主要快速排序+插入排序+堆排序的合体

  5. [Web 前端] 004 html 小练习

    1. 锚点 用法 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> < ...

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

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

  7. 浅谈C++之冒泡排序、希尔排序、快速排序、插入排序、堆排序、基数排序性能对比分析之后续补充说明(有图有真相)

    如果你觉得我的有些话有点唐突,你不理解可以想看看前一篇<C++之冒泡排序.希尔排序.快速排序.插入排序.堆排序.基数排序性能对比分析>. 这几天闲着没事就写了一篇<C++之冒泡排序. ...

  8. IOS- 快速排序,冒泡排序,直接插入排序和折半插入排序,希尔排序,堆排序,直接选择排序

    /*******************************快速排序 start**********************************///随即取 当前取第一个,首先找到第一个的位置 ...

  9. Javascript中的冒泡排序,插入排序,选择排序,快速排序,归并排序,堆排序 算法性能分析

    阿里面试中有一道题是这样的: 请用JavaScript语言实现 sort 排序函数,要求:sort([5, 100, 6, 3, -12]) // 返回 [-12, 3, 5, 6, 100],如果你 ...

随机推荐

  1. eclipse快捷提示原理

    eclipse快捷提示利用的是java反射,因为只有反射才能让eclipse知道类有哪些变量和方法.

  2. 造成segmentation fault的可能原因分析

    一 造成segment fault,产生core dump的可能原因 1.内存访问越界 a) 由于使用错误的下标,导致数组访问越界 b) 搜索字符串时,依靠字符串结束符来判断字符串是否结束,但是字符串 ...

  3. BZOJ5372: [Pkusc2018]神仙的游戏

    BZOJ5372: [Pkusc2018]神仙的游戏 https://lydsy.com/JudgeOnline/problem.php?id=5372 分析: 如果\(len\)为\(border\ ...

  4. CQOI2018做题记录

    T1.破解D-H协议 传送门 这个题就是BSGS的板子题-- 然后这里补充一点嘛,就是第二重循环的枚举范围.我们是在枚举\(a^{tm-y}\),把tm换成i,这个的最大值就是\(i - (m - 1 ...

  5. java中的设计模式及其六大原则

    设计模式分类: 一共分为3大类:创造型模式.结构型模式.行为型模式. 创造型模式:工厂方法(FactoryMethod).抽象工厂模式(AbstractFactory).建造者模式(Builder). ...

  6. Java中读取输入方式的性能比较

    程序开发过程中,需要从键盘获取输入值是常有的事,但Java它偏偏就没有像c语言给我们提供的scanf(),C++给我们提供的cin()获取键盘输入值的现成函数!Java没有提供这样的函数也不代表遇到这 ...

  7. Azure PIP (Instance Level Public IP)

    微软的Azure平台已经支持Instance Level Public IP功能.当有复杂协议的情况下,需要开启多个端口的情况下,可以考虑开启PIP功能. 先介绍几个概念: VIP – virtual ...

  8. 百度之星 hdu5701 中位数计数

    http://acm.hdu.edu.cn/showproblem.php?pid=5701 给出一个序列,取其中的任何一个连续的序列,该序列的数从小到大排列,待更新,,, #include<i ...

  9. css3 tranform perspective属性

    perspective 属性用于规定观察点距离元素的距离, 1 观察点距离元素越近,元素变形就越大,灭点距离越近. 2 观察点距离元素越远,元素变形越小,灭点距离也就越远. 比如设置perspecti ...

  10. Ruby中print、p、puts的区别

    三个方法的作用都是将一个字符串打印到控制台  比较项目  puts  print p   换行符 末尾添加换行符  末尾不加换行符  末尾添加换行符  非字符串对象的输出  调用该对象的to_s方法 ...