堆排序

作者: Keizo | 来源:发表于2017-08-26 22:30 被阅读0次

堆排序的思想(以最小堆为例):

  • 给的无序数列,首先要将数组改造成符合最小堆
    • 关于最小堆的建造,从最后一个非叶结点开始,每个结点都向下调整
  • 若要增加记录,应该加在数组的最后,然后对这个数向上调整,知直到找到合适的位置
  • 若要删除最小值,则只要将第一个与最后一个互换,数组长度减一,从堆顶向下调整
  • 若要排序,则只要从最后一个数开始向前遍历,遍历到的每个数与堆顶互换后从堆顶向下调整,调整时数组末尾已排序好的数字不计入操作
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <stdlib.h>
#include <math.h>
#include <vector>
#include <stack>
#include <queue>
#include <map>
#include <sstream>
using namespace std;

void heapDown(int nums[], int i, int n) {
    
    int temp = nums[i];
    int j = 2 * i + 1;
    while (j < n) {
        if (j + 1 < n && nums[j + 1] < nums[j]) {
            j = j + 1;
        }
        if (temp < nums[j]) break;
        nums[i] = nums[j];
        i = j;
        j = 2 * i + 1;
    }
    nums[i] = temp;
}

void heapUp(int nums[], int i) { //向上调整只有在增加数的时候用到
    int temp = nums[i];
    int j = (i - 1) / 2;
    while (j >= 0 && i != 0) {
        if (nums[j] <= temp) { //只需比较新加入的数与父结点
            break;
        }
        nums[i] = nums[j];
        i = j;
        j = (i - 1) / 2;
    }
    nums[i] = temp;
}

void createHeap(int nums[], int n) {
    int i;
    for (i = (n - 1) / 2; i >= 0; i--) { //从最后一个非叶子结点开始向下调整
        heapDown(nums, i, n);
    }
}

void deleteRootNum(int nums[], int n) {
    swap(nums[0], nums[n - 1]);
    heapDown(nums, 0, n - 1);
}

void addNum(int nums[], int n, int num) {
    nums[n-1] = num;
    heapUp(nums, n-1);
}

void heapSorted(int nums[], int n) {
    for (int i = n - 1; i >= 0; i--) {
        swap(nums[i], nums[0]);
        heapDown(nums, 0, i);
    }
}

void print(string str, int nums[], int n) {
    cout<<str<<endl;
    for (int i = 0; i < n; i++) {
        cout<<nums[i]<<" ";
    }
    cout<<endl;
}

int main() {
    int n = 10;
    int nums[11] = {9, 12, 17, 30, 50, 20, 60, 65, 4, 19};
    
    createHeap(nums, n);
    print("将数组修改成最小堆:", nums, n);
    
    n = n + 1;
    addNum(nums, n, 10);
    print("插入10:", nums, n);
    
    
    deleteRootNum(nums, n);
    n = n - 1;
    print("删除了最小值:", nums, n);
    
    heapSorted(nums, n);
    //由于每次将最小的数放到最后,所以最小堆输出的数组是递增的
    print("将数组排序:", nums, n);
    
    return 0;
}

相关文章

  • 堆排序

    目录 1.堆排序介绍 2.堆排序图文说明 3.堆排序的时间复杂度和稳定性 4.堆排序实现 堆排序介绍 堆排序(He...

  • 堆排序---基础篇

    本文主要介绍堆排序的一些基本过程和分析。 大纲 堆排序简介 堆排序代码实现 1. 堆排序简介 1.1 堆排序的存储...

  • 堆和堆排序

    最小K个数 堆排序 堆排序

  • JS实现堆排序

    原理 堆排序原理 实现 说明 堆排序对大文件很有效 堆排序是不稳定排序

  • iOS算法总结-堆排序

    iOS算法总结-堆排序 iOS算法总结-堆排序

  • 堆排序

    转载:图解排序算法(三)之堆排序 预备知识 堆排序 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选...

  • 排序

    原创 堆排序: 使用visit数组从本质出发获取大顶堆排序。

  • 堆排序

    堆排序

  • C++基础入门之模板堆排序(上):模板上的list的创造与操作

    整段源码链接C++的模板元堆排序 要点 组建数据结构list 组建对list的各种基本操作 堆排序中组建堆排序个个...

  • 3.2-选择排序-堆排序

    参考链接 选择排序:堆排序(Heap Sort) 白话经典算法系列之七 堆与堆排序 堆排序与快速排序,归并排序一样...

网友评论

      本文标题:堆排序

      本文链接:https://www.haomeiwen.com/subject/udivdxtx.html