堆排序
来源:互联网 发布:xmind8 for mac序列号 编辑:程序博客网 时间:2024/06/06 09:02
如果你在搜索引擎搜到本文!不建议阅读,是本人理解所写,给自己看的。
若你阅读,可能会让你浪费时间!!!
还是请自己查阅书籍,网上的垃圾博文太多了,推荐数据结构与算法分析---C语言表述。
不要浮躁沉下心来看,比上网看垃圾强多了!
相信自己努力可以改变某些东西!多思考和总结!
代码:
#include<stdio.h>#define LeftChild(i) ( 2*i + 1 )// 下标 i = 0 存储是最大的值 , 所以leftchild 是 2×i + 1 ;void PercDown(int a[] , int i , int n){ int child , temp ; for( temp = a[i] ; LeftChild(i) < n ; i = child ) { child = LeftChild(i); if ( (child != n -1) && (a[child+1] > a[child]) ) //挑选最大的子节点 child++; if( temp < a[child] ) //最大的子节点 赋值给 父节点 a[i] = a[child] ; else break; } a[i] = temp ; //把之前节点 赋值给 }void Swap(int *a , int *b){ int *Tmp ; *Tmp = *a ; *a = *b ; *b = *Tmp ;}void HeapSort(int a[] ,int n ){ int i ; for(i = n/2 ; i >= 0 ; i-- ) // n/2 标号最大分支节点,即最大的非叶子节点标号 ; PercDown(a , i , n); //求最大堆,采用下滤,使最大的浮上来,形成新的堆 printf("The first build heap:\n"); for(i = 0 ; i < n ; i++ ) printf("%d \t" , a[i]); printf("\n"); for(i = n -1 ; i > 0 ; i-- ) { Swap( &a[0] , &a[i] ) ; //本代码 堆排序是数组从下标0开始的 ,堆的最后元素和堆的首元素交换 ,仅仅用一个数组就可以排序 PercDown(a , 0 , i ) ; //每筛选出一个最大的堆,就开始下滤,建立新堆 }}int main(){ int a[] = {31,41,59,26,53,58,97}; //测试数组 int len , i ; len = sizeof(a)/sizeof(int); HeapSort( a , len ); //建立堆 printf("This is a HeapSort Data:\n"); for(i = 0 ; i < len ; i++ ) //遍历已经拍好序的数组 printf("%d \t" , a[i]); return 1;}
结果:
The first build heap:
97 53 59 26 41 58 31
This is a HeapSort Data:
26 31 41 53 58 59 97
Process returned 1 (0x1) execution time : 0.025 s
Press any key to continue.
0 0
- 堆及堆排序
- 堆/堆排序特点
- 【二叉堆、堆排序】
- 二叉堆 & 堆排序
- 二叉堆 & 堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆和堆排序
- 堆排序(最大堆)
- 堆和堆排序
- 堆和堆排序
- 堆及堆排序
- 堆和堆排序
- 堆与堆排序
- filepath = path
- public class定义类
- 属性与内存管理(属性与内存管理都是相互关联的) 第一部分
- Jobdu 题目1009:二叉搜索树
- 美拍为何会这样火
- 堆排序
- LeetCode-Swap Nodes in Pairs
- 结构体中Char a[0]用法——柔性数组
- hdu 4956 Poor Hanamichi(BC.R#5) 读懂了题意就是水题/坑- -比赛中居然没有过
- 属性与内存管理(属性与内存管理都是相互关联的) 第二部分
- C#面向对象基础学习笔记
- ACM大牛!!!!!!
- 字面量(笑笑语法)
- ios基本画图原理API解释