排序---堆排序
堆排序
1. 堆排序
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。详情见堆排序【维基百科】
堆排序算法的演示。首先,将元素进行重排,以匹配堆的条件。图中排序过程之前简单的绘出了堆树的结构。
|
|
分类 | 排序算法 |
---|---|
数据结构 | 数组 |
最坏时间复杂度 | |
最优时间复杂度 | [1] |
平均时间复杂度 | |
最坏空间复杂度 | total, auxiliary |
2. 堆排序实现
#include<iostream> #include<vector> #include <stdlib.h> #include <time.h> using namespace std; void HeapAdjust(vector<int> &array, int start, int end){ int dad = start; int son = 2 * dad + 1; while(son <= end){ if(son + 1 <= end && array[son] <= array[son+1]) son += 1; if(array[dad] > array[son]) return ; else{ swap(array[dad], array[son]); dad = son; son = 2 * dad + 1; } } } void HeapSort(vector<int> &array){ for(int i = array.size()/2-1; i >= 0; i--){ HeapAdjust(array, i, array.size()-1); } for(int j = array.size()-1; j >= 0; j--){ swap(array[0], array[j]); HeapAdjust(array, 0, j-1); } } // 判断array是否有序 bool isOrder(vector<int> &array){ for(int i = 1; i < array.size(); i++){ if(array[i] < array[i-1]) return false; } return true; } // 生成n个介于min,max之间的整型数 vector<int> RAND(int max, int min, int n) { vector<int> res; srand(time(NULL)); // 注释该行之后,每次生成的随机数都一样 for(int i = 0; i < n; ++i) { int u = (double)rand() / (RAND_MAX + 1) * (max - min) + min; res.push_back(u); } return res; } // 使用20000000个介于1,10000之间的数据进行测试 int main(int argc, char const *argv[]) { vector<int> a = RAND(1, 10000, 20000000); clock_t start = clock(); HeapSort(a); clock_t end = clock(); cout << "Time goes: " << (double)(end - start) / CLOCKS_PER_SEC << "sec" << endl; bool sorted = isOrder(a); cout<<sorted<<endl; return 0; }
3. 运行结果
使用20000000个介于1,10000之间的数据进行测试,运行结果如下:
Time goes: 25.169sec 1 [Finished in 27.4s]