堆排序的实现
2015-04-22 10:15
302 查看
堆排序是一种很优秀的算法,还可以利用堆实现优先队列!
特点:1.最坏情况的时间复杂度: 上限 nlgn;(比插入排序快)2.原址排序 (不同于归并排序)步骤:1.最大堆维护2.建堆3.堆排序(不断地从根取出元素,再调用维护函数保持堆性质)//数组的第一个元素是指示堆中元素的数量,不包括a[0],所以数组总大小为 a[0]+1,就是元素个数n+1;//调整最大堆
#define LEFT(i) (i << 1)#define RIGHT(i) ((i << 1) + 1)#define PARENT(i) (i >> 1)
void heap_adj(int a[], int i){int large;int left = LEFT(i);int right = RIGHT(i);if (left <= a[0] && a[left] > a[i])large = left;elselarge = i;if (right <= a[0] && a[right] > a[large])large = right;if (large != i){exchange(a+i, a+large);heap_adj(a, large);}}void exchange(int *a, int *b){int tmp;tmp = *a;*a = *b;*b = tmp;}//建立最大堆, n/2+1,,,,,n 就是叶子了!void build_max_heap(int a[]){int i;for ( i = a[0]/2; i >=1; i--){heap_adj(a,i);}}//堆排序void heap_sort(int a[]){int i;int j = a[0];i = a[0];build_max_heap(a);while (i >= 2){exchange(a+1, a+i);i--;a[0]--;heap_adj(a, 1);}a[0] = j;//因为上面减了,为了方便后面打印而做的动作,后面改进}
相关文章推荐
- 用java实现一个基于堆排序的优先队列
- [原]堆排序的java实现
- 堆排序及优先级队列Java实现
- 插入法排序、选择排序、冒泡法、快速排序、堆排序的C实现
- 算法导论 习题6.2-5 用迭代法实现堆排序
- 堆以及php实现堆排序
- 算法珠玑--再看堆排序(Heap Sort)的实现
- 堆排序(Heap Sort)算法的实现
- Java实现堆排序(大根堆)
- 堆排序(算法导论实现)
- 堆排序JAVA版实现
- 用堆排序实现查找最小的K个元素
- 基于堆排序实现的找出N个数据的前M大数据之Java实现
- 堆的实现、堆排序、优先队列
- 堆的操作和堆排序-最小堆实现递减排序-C++
- 基本算法_堆排序_Java实现
- 用堆排序实现查找最小的K个元素 java
- 堆和堆排序(堆实现优先级队列)
- 各类排序算法实现(堆排序、希尔排序、快速排序、归并排序等)