堆排序
2018-02-03 11:47
120 查看
堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]]>= A[i]。在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。#include <stdlib.h>
#include <stdio.h>
#include <vector>
#define SWAP(x,y,t) t=x;x=y;y=t;
void print(std::vector<int> arr) {
for (int i = 0; i < arr.size(); i++) {
printf("%6d", arr[i]);
}
printf("\n");
}
void heapSort(std::vector<int> arr,int i) {
int tmp;
for(int j=i;j>0;j--){
int rootIndex=(j-2+j%2)>>1;
if(arr[rootIndex]<arr[j]){//将较大值往前迁移
SWAP(arr[rootIndex],arr[j],tmp);
}
}
SWAP(arr[i],arr[0],tmp);//将首位最大值与末尾交换
if(i>0){
heapSort(arr,--i);
}else{
print(arr); //计算结束
}
}
void heapSort(std::vector<int> arr) {
heapSort(arr,arr.size()-1);
}
int main(){
std::vector<int> a = { 2,5,3,0,2,3,0,-1};
heapSort(a);
return 0;
}
相关文章推荐
- 算法--堆排序
- Python 面试题 - 堆排序 & 演算过程
- 排序算法-堆排序
- 为什么从5000个数中找出10个最大的堆排序最快?
- 算法设计与分析基础-6.4、堆和堆排序
- 哈夫曼树结合堆排序 POJ(3253)
- 算法学习笔记----第二部分:排序和顺序统计量----第6章、堆排序
- 算法导论之插入排序,选择排序,归并排序,冒泡排序,希尔排序,堆排序,快速排序的c语言实现
- 堆排序 一个综合了插入排序和二路归并特点的排序算法(未测试)
- Heap-堆排序
- [字符串hash][堆排序][AC自动机][usaco3.1.5]Contact
- 堆排序
- 算法导论堆排序Java实现
- C++数据结构--堆排序
- C/C++排序之五(堆排序)
- 堆排序
- 图灵标准版堆排序
- 堆排序详解以及java实现
- 堆排序
- 堆排序