堆排序
来源:互联网 发布:网络社区的主要功能 编辑:程序博客网 时间:2024/06/10 23:19
堆排序利用二叉树模型,把要排序的元素建成一个类似完全二叉树的样子,将每三个元素中最大的元素调整至这三个结点中根结点的位置,调整后最大元素位于整个树的根结点位置。将根结点的元素与最后一个元素交换,则最大数沉底,将树的长度减一,调整结点位置,重复操作,最后得到排好序的数组。
堆排序是不稳定排序。
以下为代码演示
void Swap(int *a, int i, int j){int tmp = a[i];a[i] = a[j];a[j] = tmp;}void printA(int *a,int len){int i;for(i = 0; i < len; i++){printf("%4d",a[i]);}printf("\n");}void heapify(int *a, int i, int len){int left = 2*i+1; //左孩子结点下标int right = 2*i+2; //右孩子结点下标int max = i; //三个结点中最大元素的下标if(left < len && a[left] > a[max])max = left;if(right < len && a[right] > a[max])max = right;if(max != i) //当父节点不是三个结点中最大的元素要进行调整{Swap(a, i, max);heapify(a, max, len); //调整被交换的结点}}void heapSort(int *a, int len){int i;//建堆for(i = 0; i < len; i++){heapify(a, i, len);}for(i = len-1; i > 0; i--){Swap(a, 0, i); //拿堆顶元素与堆尾元素交换len--; //找到一个最大元素以后堆大小减一heapify(a, 0, len); //调整堆顶元素}}int main(){int a[10] = {7,2,9,4,1,3,8,6,5,0};int len = sizeof(a)/sizeof(a[0]);heapSort(a,len);printA(a,len);return 0;}
阅读全文
0 0
- 堆及堆排序
- 堆/堆排序特点
- 【二叉堆、堆排序】
- 二叉堆 & 堆排序
- 二叉堆 & 堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆和堆排序
- 堆排序(最大堆)
- 堆和堆排序
- 堆和堆排序
- 堆及堆排序
- 堆和堆排序
- 堆与堆排序
- Spring mvc多个视图解析器优先级以及freemarker中获取项目根路径
- 建造者设计模式
- sql中exists,not exists的用法
- SIFT算法计算原理
- linux下的centos出现error while loading shared libraries错误
- 堆排序
- Web安全漏洞简介之XSS(一)
- SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
- 0-1背包问题
- wordpress上传插件安装,未能找到WordPress内容目录(wp-content)
- 电子通讯录(用文件写,掉电可保存联系人)
- CSS样式表、JS脚本加载顺序与SpringMVC在URL路径中传参数与SpringMVC 拦截器
- 问题 : 亲和数
- js 全局变量优点和缺点