堆排序
2012-11-08 19:52
148 查看
堆排序只需要一个记录的辅助空间,代码中的tmp。
代码中的数组第一个元素a[0],没参与排序,需要排序的元素从1开始,这样代码的逻辑更容易理解(a[i] > a[2i] && a[i] > a[2i + 1] ) || (a[i] < a[2i] && a[i] < a[2i + 1])。i = (1, 2, ... [n/2])
时间复杂度为nlogn, 最坏的情况下也是如此,这是比快排有优势的地方。
代码中的数组第一个元素a[0],没参与排序,需要排序的元素从1开始,这样代码的逻辑更容易理解(a[i] > a[2i] && a[i] > a[2i + 1] ) || (a[i] < a[2i] && a[i] < a[2i + 1])。i = (1, 2, ... [n/2])
时间复杂度为nlogn, 最坏的情况下也是如此,这是比快排有优势的地方。
#include <iostream> using namespace std; void heapAdjust( int a[], int s, int length) { int tmp = a[s]; for (int j = 2*s; j<= length; j = 2*j) { if ( j < length && a[j] < a[j + 1]) { j++; } if (tmp >= a[j]) { break; } a[s] = a[j]; s = j; } a[s] = tmp; } void heapSort(int a[], int length) { int i = 0; for (i = length/2; i >= 0; i--) { heapAdjust(a, i, length); } int tmp = 0; for (i = length; i > 0; i--) { tmp = a[i]; a[i] = a[1]; a[1] = tmp; heapAdjust(a, 1, i - 1); } } void print(const int a[], int &n) { for (int i = 0; i < n; i++) { cout << a[i] << " "; } cout << endl; } int main(int argc, char * argv[]) { int a[] = {1230, 12, 31, 3, 324, 23, 43, 78, 100}; int size = sizeof(a)/sizeof(int); cout << "before sort:" << endl; print(a, size ); heapSort(a, size - 1); cout << "after sort:" << endl; print(a, size ); }
相关文章推荐
- 2015年大二上-数据结构-内部排序-(6)-堆排序
- 堆排序
- Python一日一练12----堆排序
- 算法导论第六章 -- 堆排序
- 经典算法——堆排序笔试题
- 基础算法-堆排序
- 《常见算法和数据结构》优先队列(3)——堆排序
- 堆排序的c语言实现
- 选择排序 堆排序
- 排序算法:堆排序
- 堆排序
- 找出N个数据中的最大的K个数据---堆排序
- 排序(冒泡排序,插入排序,希尔排序,选择排序,堆排序)
- 堆排序(代码片段)
- 浅谈算法和数据结构: 五 优先级队列与堆排序
- js算法:heap sort 使用堆排序
- 郭郭自学笔记(1):堆排序1.0
- 排序---堆排序
- 非递归方法的堆排序实现
- 排序总结:堆排序、快速排序、归并排序、基数排序