堆排序(C#实现)

news/2024/5/19 3:53:57 标签: 堆排序, C#

趁考试周,总结一下这学期所学的数据结构与算法知识。这次先按考试内容来总结,暑假进行完善。

堆排序C#实现)

背景

堆排序,就是利用这种数据结构来实现排序功能。本文介绍堆排序的基本原理及代码实现。

此外,本文只介绍升序排序的情况。

基本理论

在这里插入图片描述
堆分为大根堆和小根堆,当满足双亲结点均大于孩子结点时,称为大根堆;反之,若双亲结点均小于孩子结点时,称为小根堆。

实现过程:

给定一个含n个元素的序列,构建为大根堆,输出堆顶元素(实质上是将堆顶元素置换到序列尾部),对剩下的 n − 1 n-1 n1元素构建大根堆,输出堆顶元素,如此反复,得到升序排序序列。

核心问题

堆排序的核心问题有两个,一个是如何建堆,另一个是输出堆顶元素后重新构建大根堆

  1. 初始建堆
    在这里插入图片描述
  2. 调整新堆
    在这里插入图片描述

代码实现:

C#">/// <summary>
/// 二叉堆的重构(针对于已构建好的二叉堆首尾互换之后的重构)
/// </summary>
/// <param name="Key"></param>
/// <param name="j">根结点j</param>
/// <param name="vCount">结点数</param>
public void Restore(int[] Key, int j, int vCount)
{
    while (j <= vCount / 2) // 保证根结点有子树
    {
        //找出左右儿子的最大值
        int m = (2 * j + 1 <= vCount && Key[2 * j + 1] > Key[2 * j]) ? 2 * j + 1 : 2 * j;

        if (Key[m] > Key[j])
        {
            int temp = Key[m];
            Key[m] = Key[j];
            Key[j] = temp;
            j = m;
        }
        else
        {
        	break;
        }
    }

}
/// <summary>
/// 堆排序
/// </summary>
/// <param name="Key">待排序数组</param>
public void HeapSort(int[] Key)
{
    int vCount = Key.Length;
    int[] tempKey = new int[vCount + 1];
    // 元素索引从1开始
    for (int i = 0; i < vCount; i++)
    {
    	tempKey[i + 1] = Key[i];
    }

    // 初始数据建堆(从含最后一个结点的子树开始构建,依次向前,形成整个二叉堆)
    for (int i = vCount / 2; i >= 1; i--)
    {
    	Restore(tempKey, i, vCount);
    }

    // 不断输出堆顶元素、重构堆,进行排序
    for (int i = vCount; i > 1; i--)
    {
        int temp = tempKey[i];
        tempKey[i] = tempKey[1];
        tempKey[1] = temp;
        Restore(tempKey, 1, i - 1);
    }

	//排序结果
    for (int i = 0; i < vCount; i++)
    {
    	Key[i] = tempKey[i + 1];
    }
}

http://www.niftyadmin.cn/n/1051538.html

相关文章

django-media配置

setting配置MEDIA_ROOT os.path.join(BASE_DIR,"blog","media","upload")MEDIA_URL "/media/" urls配置&#xff1a;from blogCMS import settingsfrom django.views.static import serve# media配置url(r^media/(?P<path>.*…

JSP分页技术实现

summary:使用工具类实现通用分页处理author: evan_zhaoemail: evan_zhaohotmail.com  目前比较广泛使用的分页方式是将查询结果缓存在HttpSession或有状态bean中&#xff0c;翻页的时候从缓存中取出一页数据显示。这种方法有两个主要的缺点&#xff1a;一是用户可能看到的是过…

快速排序(C#实现)

快速排序 快速排序的思想很简单&#xff0c;但其效率却是排序算法中最高的。 背景 本文介绍快速排序&#xff0c;实现升序排列。 基本理论 代码实现&#xff1a; /// <summary> /// 快速排序 /// </summary> /// <param name"Key">待排序数组…

经典SQL语句大全(绝对的经典)

经典SQL语句大全(绝对的经典) 一、基础 1、说明&#xff1a;创建数据库 CREATE DATABASE database-name 2、说明&#xff1a;删除数据库 drop database dbname 3、说明&#xff1a;备份sql server --- 创建 备份数据的 device USE master EXEC sp_addumpdevice …

mysql 删除表中重复数据留一条

create table dept( depno int(2), deptname varchar(30) ) select * from dept limit 3,4 insert into dept values(12,kang6) /*删除重复数据 delete from dept where depno in ( select a.did from (select max(depno) as did from dept group by deptname having cou…

R语言学习笔记之九

摘要: 仅用于记录R语言学习过程&#xff1a; 内容提要&#xff1a; 时间与日期数据的处理&#xff1b; lubridate包&#xff1b; 时间序列介绍及举例 正文&#xff1a; 时间与日期数据的处理 n 导读&#xff1a; u 时间生成函数&#xff1a;as.Date() > as.Date(2017-02-1…

线性表(顺序结构实现)

线性表&#xff08;顺序结构实现&#xff09; 背景 今天来复习 以数组这种顺序结构 实现的线性表 基本理论 线性表的定义以及实现的操作如下&#xff1a; 代码实现 首先定义一个接口&#xff0c;来定义线性表的可进行的操作 /// <summary> /// 线性表接口&#…

分页技巧(基于自定义标签+JSTL+Struts)

这里把自己一些分页的技巧整理下发上来...因为这是在实际项目使用的,,,所以跟其他一些业务方法有关联...还有就是使用了struts和JSTL(包括EL)标签库... 效果如下图: bean代码: CODE:/** 创建日期 2006-1-26* author Woden Wang* power by Heatpixel.com*/package org.woden.mo…