排序 | 堆排序

先用一段 C++ 代码来看看推排序的过程:

 1 #include <iostream>
 2 #include <algorithm>
 3 using namespace std;
 4
 5 bool cmp(const int lhs, const int rhs)
 6 {
 7     return lhs > rhs;
 8 }
 9
10 int main()
11 {
12     int arr[] = {4, 2, 10, 9, 5, 6, 8, 6, 7, 1, 3};
13     make_heap(arr, arr+10);
14     for(int i = 11; i >= 0; --i) {
15         pop_heap(arr, arr+i);
16         for(int i = 0; i < 11; ++i) cout << arr[i] << ‘ ‘;
17         cout << endl;
18     }
19
20     return 0;
21 }

主要就是 make_heap、pop_heap

make_heap:建堆,默认最大堆-》得到递增数组(因为pop_heap是把堆顶取出依次放到后面)

pop_heap:arr[0]和arr[i]交换,并维护arr[0]到arr[i-1]的堆结构。

meke_heap 里面可以细分为从下往上建堆,递归的来说就是要维护 i,就得维护 i.left 和 i.right。

而 pop_heap 就是 n 次维护 root 节点。

所以,实际上,只需要写一个 maxHeapify。

 1 void maxHeapify(int arr[], int n, int i)
 2 {
 3     int l = 2*i;
 4     int r = 2*i + 1;
 5     int largest = i;
 6     if(l < n && arr[l] > arr[largest])
 7         largest = l 9     if(r < n && arr[r] > arr[largest])
10         largest = r;
11
12     if(largest == i) return;
13     swap(arr[i], arr[largest]);
14     maxHeapify(arr, n, largest);
15 }

维护堆的过程简单来说就是不断往下沉。

后面的的 meke_heap 和 pop_heap 也就不难写了。

makeHeap(arr, n) :

  for i = n/2 downto 1 :

    maxHeap(arr, n, i);

popHeap(arr, n) :

  swap(arr[0], arr[--n]);

  maxHeap(arr, n, 0);

然后 sortHeap 也容易写出来了:

sortHeap(arr, n) :

  makeHeap(arr, n);

  for i = n downto 0 :

    popHeap(arr, i);

时间: 2024-10-09 23:37:24

排序 | 堆排序的相关文章

插入排序 | 冒泡排序 | 希尔排序 | 堆排序 | 快速排序 | 选择排序 | 归并排序

以下是最近学习各种算法的代码实现: #include <stdlib.h> #include <stdio.h> #include <time.h> #include <limits.h> typedef int EleType; typedef int (*CompFunc)(void *,void *); int IntComp(void * a,void *b) { if(*(int *)a > *(int *)b) return 1; if(*

排序 选择排序&amp;&amp;堆排序

选择排序&&堆排序 1.选择排序: 介绍:选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理如下.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾.以此类推,直到所有元素均排序完毕. 步骤:假设数组array长度为N即有数组内有N个数据未排序数据 1.第一趟遍历将这N个数据中最小的数据和array[0]交换. 2.第二趟则遍历N-1个数据,将这N-1个数据中最小的和arra

C# 插入排序 冒泡排序 选择排序 高速排序 堆排序 归并排序 基数排序 希尔排序

以下列出了数据结构与算法的八种基本排序:插入排序 冒泡排序 选择排序 高速排序 堆排序 归并排序 基数排序 希尔排序,然后是測试的样例.代码位置:http://download.csdn.net/detail/luozuolincool/8040027 排序类: public class Sortings { //插入排序 public void insertSort(int[] array) { int temp = 0; int index = 0; for (int i = 0; i <

排序——堆排序算法

堆排序利用的完全二叉树这种数据结构所设计的一种算法,不过也是选择排序的一种. 堆实质上是满足如下性质的完全二叉树:k[i]<=k[2*i]&&k[i]<=k[2*i+1]或者k[i]>=k[2*i]&&k[i]>=k[2*i+1], 树中任一非叶子结点的关键字均不大于(或不小于)其左右孩子(若存在)结点的关键字. 堆分大顶堆和小顶堆:k[i]<=k[2*i]&&k[i]<=k[2*i+1]是小顶堆,k[i]>=k[2

八大排序算法之四选择排序—堆排序(Heap Sort)

堆排序是一种树形选择排序,是对直接选择排序的有效改进. 基本思想: 堆的定义如下:具有n个元素的序列(k1,k2,...,kn),当且仅当满足 时称之为堆.由堆的定义可以看出,堆顶元素(即第一个元素)必为最小项(小顶堆). 若以一维数组存储一个堆,则堆对应一棵完全二叉树,且所有非叶结点的值均不大于(或不小于)其子女的值,根结点(堆顶元素)的值是最小(或最大)的.如: (a)大顶堆序列:(96, 83,27,38,11,09) (b)  小顶堆序列:(12,36,24,85,47,30,53,91

希尔排序 堆排序 归并排序

希尔排序(by Donald Shell): 假定给了一个需要排序的数组并且 按照5-间隔的方式进行排序 附图如下 我们  慢慢的按照 越来越小的间隔开始去排序      (最后只能是间隔为1). 堆排序: 先回顾一下插入排序 void Selection_Sort ( ElementType A[], int N ) { for ( i = 0; i < N; i ++ ) { MinPosition = ScanForMin( A, i, N–1 ); //对应的也是一个for循环 没有最好

数据结构排序-堆排序

堆排序就是利用了最大堆(或最小堆)堆顶记录的关键字最大(或最小)这一特征,使得在当前无序区中选取最大(或最小)关键字变得简单.以最大堆为例,它的基本思想就是: 先将初始文件R[1..n]建成一个最大堆,此堆为初始的无序区: 再将关键字最大的记录R[1](即堆顶)和无序区的最后一个记录R[n]交换,由此得到新的无序区R[1..n-1]和有序区R[n],且满足R[1..n-1].keys≤R[n].key: 由于交换后新的根R[1]可能违反堆性质,故应将当前无序区R[1..n-1]调整为堆.然后再次

选择排序---堆排序算法(Javascript版)

堆排序分为两个过程: 1.建堆. 堆实质上是完全二叉树,必须满足:树中任一非叶子结点的关键字均不大于(或不小于)其左右孩子(若存在)结点的关键字. 堆分为:大根堆和小根堆,升序排序采用大根堆,降序排序采用小根堆. 如果是大根堆,则通过调整函数将值最大的节点调整至堆根. 2.将堆根保存于尾部,并对剩余序列调用调整函数,调整完成后,再将最大跟保存于尾部-1(-1,-2,...,-i),再对剩余序列进行调整,反复进行该过程,直至排序完成. 以下代码在nodejs中执行通过 //调整函数function

选择排序—堆排序(Heap Sort) 没看明白,不解释

堆排序是一种树形选择排序,是对直接选择排序的有效改进. 基本思想: 堆的定义如下:具有n个元素的序列(k1,k2,...,kn),当且仅当满足 时称之为堆.由堆的定义可以看出,堆顶元素(即第一个元素)必为最小项(小顶堆). 若以一维数组存储一个堆,则堆对应一棵完全二叉树,且所有非叶结点的值均不大于(或不小于)其子女的值,根结点(堆顶元素)的值是最小(或最大)的.如: (a)大顶堆序列:(96, 83,27,38,11,09) (b)  小顶堆序列:(12,36,24,85,47,30,53,91

排序算法7--选择排序--堆排序

堆排序 1.堆排序是一种树形选择排序,在排序过程中,将待排序的记录r[1..n]看成是一棵完全二叉树的顺序存储结构,利用完全二叉树的双亲结点和孩子结点之间的内在关系,在当前无序的序列中选择关键字最大(或者最小的)记录   1.1.先将无序队列,列成二叉树的的样子 1.2.建初堆.从n/2向上取整处开始调整,当前节点数字一定要大于(小于)左右两孩子,n/2--,一直向上若最后排序结果是升序就调整成大顶堆,若是降序就调整成小顶堆 1.3.开始排序,将堆顶元素和最后一个元素互换位置,换下来的即可以依次