通用堆排序实现
来源:互联网 发布:火狐 知乎 编辑:程序博客网 时间:2024/06/07 00:57
//对数组中的元素按堆排序
void sift(void* a, int esize,int i, int n,int(*cmp)(void *,void*,void *),void *param,void *tmp){
int child;memcpy(tmp,(char*)a+esize*i,esize);
while(n >= 2 * (i+1)){
child = 2 * (i+1);
if (child < n && cmp((char*)a+child*esize, (char*)a+(child-1)*esize,param)>0){
child++;
}
if (cmp(tmp,(char*)a+(child-1)*esize,param)<0){
memcpy((char*)a+esize*i,(char*)a+esize*(child-1),esize);
}
else break;
i = child-1;
}
memcpy((char*)a+i*esize,tmp,esize);
}
void heap_sort(void *array,int element_size,int element_num,int(*cmp)(void *,void*,void *),void *param){
int i;
void *tmp=malloc(element_size);
for (i = (element_num-1) / 2; i >= 0; i--){
sift(array,element_size, i, element_num,cmp,param,tmp);
}
for (i = element_num-1; i >= 0; i--){
memcpy(tmp,array,element_size);
memcpy(array,(char*)array+element_size*i,element_size);
memcpy((char*)array+element_size*i,tmp,element_size);
sift(array, element_size,0, i,cmp,param,tmp);
}
free(tmp);
}
int cmp(void *a,void *b,void *p){
return *(int*)a-*(int*)b;
}
int main(){
int a[]={1,4,100,6,3,0,2,-1};
int i;
heap_sort(a,sizeof(int),sizeof(a)/sizeof(int),cmp,NULL);
for(i=0;i<sizeof(a)/sizeof(int);i++){
printf("%d ",a[i]);
}
printf("\n");
}
- 通用堆排序实现
- 【排序】堆排序实现
- 用堆实现堆排序
- Python实现 [堆] [堆排序]
- 最大堆实现堆排序
- 堆以及堆排序实现
- 堆实现 及 堆排序
- 最大堆实现堆排序
- 堆排序的实现
- 堆排序的实现
- 堆排序实现...
- 堆排序的实现
- 堆排序实现
- 堆排序算法实现
- 堆排序的实现
- 堆排序实现
- 堆排序----c++实现
- 堆排序C++实现
- 黑客人物近距离接触 中国黑客:转瞬即逝的激情
- ResultSet 简单介绍
- 在Windows上通过ctypes遍历进程
- POJ 2503
- 【操作详解】终于成功移植Mplayer到OK6410开发板上了,发帖详述移植全过程!(转载)
- 通用堆排序实现
- 分解算法,将一个数字分解成最合适的数组内数字相加。
- PC机与mini2440 arm开发板的文件传输/通讯小结
- Linux 系统中安装网卡驱动时出现"设备eth0似乎不存在"解决办法
- Objective-c 读写文本文件
- Maximo批处理工具说明
- 感慨一点
- linux下USB转串口识别1
- [资产|安全|PM|工单] configDb重建索引出错解决方法