四、堆排序

堆排序

堆排序是指利用堆积树这种数据结构所设计的一种排序算法,它是选择排序的一种。

可以利用数组的特点快速定位指定索引的元素。

以下代码是一个简单堆排序算法,功能是排序一个整数数组,用C#实现:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HeapSort
{
    class Program
    {
        private static void HeapDown(int[] arr, int pos, int size)
        {
            int LChild = 2 * pos + 1;
            int RChild = 2 * pos + 2;

            int max = pos;
            if (pos < size / 2)
            {
                if (LChild < size && arr[LChild] > arr[max])
                {
                    max = LChild;
                }
                if (RChild < size && arr[RChild] > arr[max])
                {
                    max = RChild;
                }
                if (max != pos)
                {
                    int tmp = arr[pos];
                    arr[pos] = arr[max];
                    arr[max] = tmp;
                    HeapDown(arr, max, size);
                }
            }

        }
        private static void BuildHeap(int[] arr)
        {
            int size = arr.Length;
            for (int i = size / 2 - 1; i >= 0; i--)
            {
                HeapDown(arr, i, size);
            }
        }
        public static void HeapSort(int[] arr, int size)
        {
            BuildHeap(arr);
            for (int i = 0; i < arr.Length; i++)
            {
                int tmp = arr[0];
                arr[0] = arr[arr.Length - 1 - i];
                arr[arr.Length - 1 - i] = tmp;
                HeapDown(arr, 0, size - 1 - i);
            }

        }
        static void Main(string[] args)
        {
            int[] arr = new int[11] { 7, 4, 3, 2, 1, 11, 1, 6, 7, 12, 3 };
            //BuildHeap(arr);
            HeapSort(arr, 11);
            foreach (int i in arr)
            {
                Console.WriteLine(i);
            }
            Console.ReadKey();
        }
    }
}
时间: 2024-10-08 16:25:23

四、堆排序的相关文章

第六章——堆排序

一 堆 堆给人的感觉是一个二叉树,但是其本质是一种数组对象,因为对堆进行操作的时候将堆视为一颗完全二叉树,树种每个节点与数组中的存放该节点值的那个元素对应.所以堆又称为二叉堆,堆与完全二叉树的对应关系如下图所示: 二叉堆可以分为两种形式:最大堆和最小堆.在这两种堆中,结点的值都要满足堆的性质. 在最大堆中,最大堆的性质是指除了根以外的所有结点i都要满足: A[PARENT(i)]>=A[i] 也就是说,某个结点的值至多与其父结点一样大.因为,堆中的最大元素存放在根结点中:并且,在任一子树中,该子

数据结构与算法——排序算法

常见排序算法主要有: 插入排序(直接插入排序.希尔排序) 选择排序(直接选择排序.堆排序) 交换排序(冒泡排序.快速排序) 归并排序 基数排序 外部排序 一.直接插入排序 算法思想:在一个待排序列中,从第二个元素开始,依次进行排序,每次都将待排序元素从后往前,依次与前面的元素进行比较,从而将带排序元素移动到一个合适的位置,直到最后一个待排序元素移动到合适位置,则排序完成. 算法特点:最好情况下时间复杂度O(n),最坏情况下时间复杂度O(n2),稳定排序算法 二.希尔排序 希尔排序算法基础:待排序

算法(第四版)学习笔记之java实现堆排序

继上一篇实现基于堆的优先队列后,这次将利用上一次完成的基于堆的能够重复删除最大元素操作的优先队列来实现一种经典而优雅的排序算法,称之为堆排序. 堆排序可分为两个阶段: 1.构建堆:在堆的构建过程中,我们将原始数组重新组织安排进一个堆中: 2.下沉排序:从堆中按递减顺序取出所有元素并得到排序结果 具体的思想在下面的代码中有较为详细的注释: /** * * @author seabear * */ public class HeapSort { /** * 1.构造大根堆:与上一篇基于堆的优先队列相

php面试题汇总四(基础篇附答案)

1. 什么事面向对象?主要特征是什么? 面向对象是程序的一种设计方式,它利于提高程序的重用性,使程序结构更加清晰.主要特征:封装.继承.多态. 2. SESSION 与 COOKIE的区别是什么,请从协议,产生的原因与作用说明? 1.http无状态协议,不能区分用户是否是从同一个网站上来的,同一个用户请求不同的页面不能看做是同一个用户. 2.SESSION存储在服务器端,COOKIE保存在客户端.Session比较安全,cookie用某些手段可以修改,不安全.Session依赖于cookie进行

Heapsort 堆排序算法详解(Java实现)

Heapsort (堆排序)是最经典的排序算法之一,在google或者百度中搜一下可以搜到很多非常详细的解析.同样好的排序算法还有quicksort(快速排序)和merge sort(归并排序),选择对这个算法进行分析主要是因为它用到了一个非常有意思的算法技巧:数据结构 - 堆.而且堆排其实是一个看起来复杂其实并不复杂的排序算法,个人认为heapsort在机器学习中也有重要作用.这里重新详解下关于Heapsort的方方面面,也是为了自己巩固一下这方面知识,有可能和其他的文章有不同的入手点,如有错

算法三之堆排序

一.堆(Heap)定义 (1)n个关键字序列Kl,K2,-,Kn称为(Heap),当且仅当该序列满足如下性质(简称为堆性质): k(i)<=k(2i)且k(i)<=k(2i+1)(1≤i≤ n/2), 当然,这是小根堆,大根堆则换成>=号. (2)k(i)相当于二叉树的非叶子结点,K(2i)则是左子节点,k(2i+1)是右子节点 若将此序列所存储的向量R[1..n]看做是一棵完全二叉树的存储结构,则堆实质上是满足如下性质的完全二叉树:树中任一非叶子结点的关键字均不大于(或不小于)其左右孩

排序系列算法——堆排序

堆:大根堆与小根堆 堆排序是建立在堆基础上的排序方法,首先了解一下什么是堆. 常用的堆一般有两种,大根堆和小根堆.堆可以看做是一棵二叉树,其父节点的值总是大于(大根堆)或者小于(小根堆)子节点的值.举一个例子: 图1 不满足堆的条件                 图2大根堆                             图3 小根堆 图1不是堆,因为不满足父节点的值大于或者小于子节点的值: 图2是大根堆,根节点是最大值,父节点都大于或等于子节点的值: 图3是小根堆,根节点是最小值,父

优先级队列与堆排序

转自:http://www.cnblogs.com/yangecnu/p/Introduce-Priority-Queue-And-Heap-Sort.html 在很多应用中,我们通常需要按照优先级情况对待处理对象进行处理,比如首先处理优先级最高的对象,然后处理次高的对象.最简单的一个例子就是,在手机上玩游戏的时候,如果有来电,那么系统应该优先处理打进来的电话. 在这种情况下,我们的数据结构应该提供两个最基本的操作,一个是返回最高优先级对象,一个是添加新的对象.这种数据结构就是优先级队列(Pri

3.比较排序之堆排序

对于堆排序会涉及一些完全二叉树知识.对于待排序列{10, 2, 11, 8, 7},把它看成是一颗完全二叉树,如下图所示. 堆分为大根堆和小根堆:大根堆表示每个根节点均大于其子节点(L(i) >= L(2i) && L(i) >= L(2i + 1)),小根堆表示每个根节点均小于其子节点(L(i) <= L(2i) && L(i) <= L(2i + 1)).(在完全二叉树中第i个节点的左子节点为2i,其右字节点为2i + 1) 本文将以大根堆的构建