选择排序之----堆排序
来源:互联网 发布:ubuntu 安装gcc 编辑:程序博客网 时间:2024/05/22 12:29
堆排序是简单选择排序的改进,是一种不稳定的排序方法。
基本思路:对一组待排序的记录序列,先将其关键字按堆的定义排列一个序列(称为初建堆),找到最小(最大)关键字后,将其取出。用剩余的n-1个元素再重建堆,便可得到次小(次大)值。如此反复执行,直到全部关键字排好序为止。
#include<stdio.h>#define Type int#define MARK 0 //占据a[0],不起实际作用#define NUM 6#define Num NUM - 1 //实际要排序的数void print(Type A[]){int i;for(i = 1; i< NUM; i++)printf("%d ", A[i]);printf("\n");}void adjust(Type *buf, int t,int w){int i,j;Type x;i = t;x = buf[i]; //待筛选的值存放在辅助单元中j = 2*i ; //buf[j] 是buf[i]的左孩子while(j<=w) //确定不越界{if((j < w)&&(buf[j] > buf[j + 1])) //若存在右子树且右子树的关键值小,则从右分支筛选,j++; //否则从左子树筛选if(x > buf[j]) //若待筛选的值大于子树的值{buf[i] = buf[j]; //进行对调i = j;j = 2*j; //继续搜索}else{break; //根不大于他的孩子的值,调整完毕,退出循环}}buf[i] = x; //将待排序的值放入恰当的位置}void heap_sort(Type *buf, int n){int i;Type x;for(i = n/2;i >= 0; i--) //初建堆adjust(buf, i, n);//初始化堆的输出printf("初始化堆的输出:"); print(buf);for(i = n; i > 1; i--) //进行n-1趟排序{x = buf[1]; //将第一个记录和当前堆中最后一个记录互换buf[1] = buf[i];buf[i] = x;adjust(buf,1,i-1); //已经筛选buf[1]结点,得到具有n-1个结点的堆。//重建堆的输出printf("第%2d次重建堆的输出:",(NUM - i));print(buf);}}int main(){Type num[NUM] = {MARK,1,32,2,12,23}; printf("Original array:");print(num);heap_sort(num,Num); //Num = NUM - 1printf("Sorted array:");print(num);return 0;}
- 选择排序之堆排序
- 选择排序之----堆排序
- 选择排序之堆排序
- 选择排序之堆排序
- 选择排序之堆排序
- 选择排序之堆排序
- 选择排序之堆排序
- 选择排序之堆排序
- 选择排序之堆排序
- 选择排序之--堆排序
- 选择排序之堆排序
- 八大排序 --选择排序 之 【堆排序】
- 排序算法-选择排序之堆排序
- 内部排序之选择排序:简单选择排序,堆排序
- 排序之选择排序、堆排序、归并排序、快速排序
- 选择排序之堆排序Java实现
- 7.4.2 选择排序之堆排序
- 2 -- 选择排序之堆排序
- 黑马程序员--C#中 的虚方法
- Android模拟器调试,出现“failed to connect to remote .vm”
- 免费无线WIFI上网
- 算法题目
- log4j的配置文件log4j.properties存放位置
- 选择排序之----堆排序
- MYSQL 建立外键关联错误
- 算是一种激励
- 触发器用到的获取当前update的信息
- Android自定义View研究:View的大小
- 背景差分算法研究资源分享
- GNU ARM汇编中的.word
- sicily 1624
- Ship application with SqliteDb