惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

小众软件
小众软件
IT之家
IT之家
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Security Archives - TechRepublic
Security Archives - TechRepublic
P
Proofpoint News Feed
C
CERT Recently Published Vulnerability Notes
阮一峰的网络日志
阮一峰的网络日志
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
The Cloudflare Blog
P
Palo Alto Networks Blog
Know Your Adversary
Know Your Adversary
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Cisco Talos Blog
Cisco Talos Blog
L
Lohrmann on Cybersecurity
AWS News Blog
AWS News Blog
J
Java Code Geeks
博客园_首页
Scott Helme
Scott Helme
WordPress大学
WordPress大学
有赞技术团队
有赞技术团队
T
The Exploit Database - CXSecurity.com
Security Latest
Security Latest
V
Visual Studio Blog
Cloudbric
Cloudbric
Jina AI
Jina AI
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
博客园 - 叶小钗
Apple Machine Learning Research
Apple Machine Learning Research
博客园 - 聂微东
人人都是产品经理
人人都是产品经理
A
Arctic Wolf
C
Cybersecurity and Infrastructure Security Agency CISA
S
SegmentFault 最新的问题
The Last Watchdog
The Last Watchdog
SecWiki News
SecWiki News
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
W
WeLiveSecurity
K
Kaspersky official blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Hacker News: Ask HN
Hacker News: Ask HN
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
宝玉的分享
宝玉的分享
Hugging Face - Blog
Hugging Face - Blog
量子位
Google Online Security Blog
Google Online Security Blog
博客园 - Franky
Simon Willison's Weblog
Simon Willison's Weblog
博客园 - 三生石上(FineUI控件)
Recent Commits to openclaw:main
Recent Commits to openclaw:main

博客园 - LeeXiaoLiang

自己写的一个javascript下拉列表类 jquery1.5.1根据元素ID获取元素对象 jquery向.ashx文件post中文乱码问题的解决 【转】通过在RowDataBound事件中把行索引绑定到控件的CommandArgument,然后在RowCommand事件中取出 - LeeXiaoLiang - 博客园 【转】GridView的RowCommand事件中取得行索引 - LeeXiaoLiang - 博客园 【转】GridView 实现服务器端和客户端全选的两种方法 ASP.NET之GridView数据绑定 - LeeXiaoLiang - 博客园 希尔排序的C语言实现(2) 希尔排序的C语言实现(1) 简单插入排序的C语言实现 对于堆排序算法的理解 【转】sqlserver中分页方法集锦 【转】高效的MySQL分页 【摘】完全二叉树 【原创】连接字符串数组 【摘】用C实现将数组转换为字符串 【原创】用C实现Trim()函数 - LeeXiaoLiang - 博客园 【转】浅谈数据库设计技巧 [转]数据库设计范式的理解
堆排序的C语言实现
LeeXiaoLiang · 2010-08-13 · via 博客园 - LeeXiaoLiang

代码

#include <stdio.h>
#include 
<stdlib.h>void HeapSort(int num[],int size);
void BuildHeap(int num[] ,int size);
void PercolateDown(int num[] , int index,int size);
void PrintHeap(const char* strMsg,int array[],int nLength); 
void Swap(int num[] , int v, int u);int main(int argc, char *argv[])
{
  /* 将数组看成完全二叉树的前序遍历结果的线性存储 */
  
int data[13]={8,5,4,6,13,7,2,9,12,11,3,10,1};
  HeapSort(data,
13);
  
  system(
"PAUSE");    
  
return 0;
}
void HeapSort(int num[] ,int size)
{
    
int i;
    
int iLength=size;
    
    PrintHeap(
"Befor Sort:",num,iLength);
    
    BuildHeap(num,size);
// 建立小顶堆   
    
    
for (i = iLength - 1; i >= 1; i--) {   
        Swap(num, 
0, i);// 将选出的最小值交换至位置i,并将索引i处设为有序区
        size--;// 每交换一次让规模减少一次(无序区的范围逐步缩小)   
        PercolateDown(num, 0,size);// 将新的首元素下滤操作 
        PrintHeap("Sort Heap:",num,iLength);  
    }
}
/* 建堆方法,只需线性时间建好;
   建堆的结果:数组的第一个元素(即树根)是所有元素中的最小值,索引小于等于size/2-1的其它元素(即其它非叶子节点)的值都是其所在子树的最小值 */   

void BuildHeap(int num[] ,int size) { 
    
int i; 
    //从最后一个非叶子节点开始,对每个非叶子节点进型最小根调整,保证每个根节点都是其子树中的最小值。相当于从最底层的父节点开始逐个调整。
    
for (i = size / 2 - 1; i >= 0; i--) {   
        PercolateDown(num, i,size);// 进行下滤操作
        PrintHeap("Build heap:",num,size);
    }   
}
    
/* 对该数进行下滤操作,直到该数比左右节点都小就停止下滤。
   即对某个根节点的值进行位置下降调整,使该值比其左右子节点都小;
   若该节点是叶子节点,则无法while循环 */

void PercolateDown(int num[] , int index,int size) {   
    
int min;// 设置最小指向下标   
    while (index * 2 + 1<size) {// 如果该数有左节点,则假设左节点最小   
        min = index * 2 + 1;// 获取左节点的下标   
        if (index * 2 + 2<size) {// 如果该数还有右节点   
            if (num[min] > num[index * 2 + 2]) {// 就和左节点分出最小者   
                min = index * 2 + 2;// 此时右节点更小,则更新min的指向下标   
            }   
        }   
        
// 此时进行该数和最小者进行比较,   
        if (num[index] < num[min]) {// 如果index最小,   
            break;// 停止下滤操作   
        } else {   
            Swap(num, index, min);
// 交换两个数,让大数往下沉   
            index = min;// 更新index的指向   
        }   
    }
// while   
}
    
// 给定数组交换两个数的位置   
void Swap(int num[] , int v, int u) {  
    
int temp = num[v];   
    num[v] 
= num[u];   
    num[u] 
= temp;   
}   
void PrintHeap(const char* strMsg,int array[],int nLength)
{
     
int i;
     printf(
"%s",strMsg);
     
for(i=0;i<nLength;i++)
     {
        printf(
"%d ",array[i]);
     }
     printf(
"\n");
}

修改自以下链接:http://www.javaeye.com/topic/604856