堆排序
2015-07-22 19:16
357 查看
堆排序
利用堆的结构(其实就是二叉树)进行排序,首先对数据进行调整调整为一个大根堆或者小根堆,其次取出最大或最小的值放入最后一个页节点,继续调整剩余的二叉树形成一个新的堆,递归直到完成。其中有几个概念需要明白,对于一个有n个节点的完全二叉树第一个非页节点为(n/2-1),其左子树为 当前节点下标(i*2+1)。
具体实现如下
运行环境:ubuntu14.04、gcc
利用堆的结构(其实就是二叉树)进行排序,首先对数据进行调整调整为一个大根堆或者小根堆,其次取出最大或最小的值放入最后一个页节点,继续调整剩余的二叉树形成一个新的堆,递归直到完成。其中有几个概念需要明白,对于一个有n个节点的完全二叉树第一个非页节点为(n/2-1),其左子树为 当前节点下标(i*2+1)。
具体实现如下
void stuckSmall(long *str,int start,int end){ if(end<=0 || start>=end || str == NULL) return; int left = 2*start+1; int right = left+1; int max = start; if(start<=end){ if(right<=end && str[max]<str[right]) max = right; if(left<=end && str[max]<str[left]) max = left; if(max != start){ swap(&str[start],&str[max]); //对子树进行递归调整 stuckSmall(str,max,end); } } } void stuckSort(long *str,int length){ if(str == NULL || length<=0) return; int i=0; //最后一个非叶节点 int n = length/2-1; //将数组调整为堆结构,最后一个非叶节点处开始 for(n;n>=0;n--){ stuckSmall(str,n,length); } for(i=length-1;i>=0;i--){ //将堆中的第一个值放入最后的位置 swap(&str[0],&str[i]); //将剩余调整为小根堆 stuckSmall(str,0,i-1); } }完整代码
#include <stdio.h> #include <malloc.h> void swap(long *A,long *B){ long tmp; tmp = *A; *A = *B; *B = tmp; } int genrand(int num,long * array ){ if (num>10000) return 0 ; srand((unsigned int)time(0)); int i=0; for(i=0;i<num;i++) array[i] = rand(); return 1; } void stuckSmall(long *str,int start,int end){ if(end<=0 || start>=end || str == NULL) return; int left = 2*start+1; int right = left+1; int max = start; if(start<=end){ if(right<=end && str[max]<str[right]) max = right; if(left<=end && str[max]<str[left]) max = left; if(max != start){ swap(&str[start],&str[max]); stuckSmall(str,max,end); } } } void stuckSort(long *str,int length){ if(str == NULL || length<=0) return; int i=0; int n = length/2-1; for(n;n>=0;n--){ stuckSmall(str,n,length); } for(i=length-1;i>=0;i--){ swap(&str[0],&str[i]); stuckSmall(str,0,i-1); } } void call(){ long *array = (long *)malloc(sizeof(long)*10); genrand(10,array); stuckSort(array,10); int i=0; for(i;i<10;i++) printf("%ld\n",array[i]); } void main(int argc,char **argv){ call(); }
运行环境:ubuntu14.04、gcc
相关文章推荐
- ZOJ 1241 Geometry Made Simple
- 问你8个问题,让你马上变清醒
- ViewPager
- Snail—UI学习之UIButton
- 离散化/分箱/分组(Discretization / binning / Interactive grouping)
- Android开发之获取相册照片和获取拍照照片二
- 猫猫学iOS之小知识之xcode6自动提示图片插件 KSImageNamed的安装
- Java培训-IO流补充
- 开门人和关门人
- 评委会打分
- Android开发之获取相册照片和获取拍照照片
- 一个奇怪的问题-1
- hdu5045Contest 概率dp
- 科技写作:英语文章中数字写法的常用规则
- 2015-07-22 知识点整理
- AE开发示例之RunGPAsync
- 第10章 菜单及其它资源_10.1 图标、鼠标指针、字符串等资源
- 评委会打分
- HDU 1708 简单dp问题 Fibonacci String
- MySQL之——服务器保持与MySQL的连接