zoukankan      html  css  js  c++  java
  • 堆排序

      堆排序是一种常见的排序算法,因为他的时间复杂度相比较于其他排序来说是比较优化的了。他的思想就是:先建一个大堆(即堆顶元素是堆中最大的),然后将堆顶元素与堆的最后一个元素交换,堆的大小减一(此时堆中最后一个元素已经是堆中最大的了),然后对剩下的元素再进行排序,如此循环,当堆中元素只剩一个的时候堆排序就完成了。

    #include<iostream>
    using namespace std;
    #include<assert.h>

    void AdjustDown(int *a, int root, size_t size)    //向下调整
    {
        int parent = root;
        int child = parent * 2 + 1;
        while (child < size)
        {
            if (child + 1 < size&&a[child + 1] > a[child])   //找到左右孩子最大的那个
                ++child;
            
            if (a[child]>a[parent])    //大堆,孩子节点要小于父亲节点
            {
                swap(a[child], a[parent]);
                parent = child;
                child = parent * 2 + 1;
            }
            else
            {
                break;
            }
        }
    }


    void Heapsort(int *a, size_t size)    //堆排序
    {
        assert(a);
        for (int i = (size - 2) / 2; i >= 0; --i)     //建堆
        {
            AdjustDown(a, i, size);
        }

        size_t end = size - 1;     //end为数组a中最后一个元素
        while (end > 0)
        {
            swap(a[0], a[end]);         //交换栈顶元素和栈顶元素
            AdjustDown(a, 0, end);    //调整
            --end;
        }
    }

  • 相关阅读:
    我的收藏:第一章:汇总
    实战:第二章:关于EZDML工具使用踩的坑
    Docker:第二章:部署项目,对镜像,容器的操作
    电商网站项目:第一章:进度
    多线程:第一章:我(线程)这一生
    性能优化:第一章:我们应该怎么优化
    关于EZDML数据库表结构制作设计工具使用踩的坑
    集群与分布的区别
    strip_tags--php
    关于html的一些杂技
  • 原文地址:https://www.cnblogs.com/qingjiaowoxiaoxioashou/p/5962918.html
Copyright © 2011-2022 走看看