600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > 堆排序实现(C++)

堆排序实现(C++)

时间:2022-07-30 06:36:45

相关推荐

堆排序实现(C++)

写堆排序的动机

自从学了堆以来,对于堆用得最多的就是STL的map,set以及优先队列,而最基本的堆构建,堆调整都没有动作做过,趁着找实习的阶段复习一下堆,实现一个堆排序。

堆介绍

堆是一个完全二叉树,也就是说,整棵树除了叶子最底层的叶子节点之外,都是填满的,而最底层的叶子节点由左到右不能有空隙。也就是除了底层,每一层都是满的,底层必须从左到右填数。而最大堆必须满足父节点大于子节点,最小堆则相反。对于堆的插入和删除都是Log(N)的时间复杂度。

堆排序思路

堆排序的思想就是先构建一个最大堆,然后不断对堆进行pop操作,把最大值pop到队列尾部。最大堆最大的特点是”子承父业“。当子节点大于父节点时候,子代替父上一线;当父节点被“提升”时候找到最大的子节点补入,剩下的空缺依次不上,遇到没有后代的时候把最后的数过继过来。由于堆是一个完全二叉树,所以堆有一个很重要的特性,就是节点i的子节点分别是i*2 + 1和i*2+2,所以并不需要真正构建一棵树。

代码

#include <iostream>#include <vector>#include <cstdlib>#include <ctime>#include <algorithm> using namespace std;void swap(int &num1,int &num2){if(num1 != num2){num1 ^= num2;num2 ^= num1;num1 ^= num2;}}void insert(vector<int> &arr_sort){//构建一个最大堆 for(int i = 1;i < arr_sort.size();i ++){int j = i;while(arr_sort[j] > arr_sort[(j - 1)/ 2]){swap(arr_sort[j],arr_sort[(j - 1)/2]);j = (j - 1)/2; }}} void pop(vector<int> &arr_sort){for(int i = 0;i < arr_sort.size();i ++){int tmp = arr_sort[0],j = 0;while(j * 2 + 2 <= arr_sort.size() - i - 1){if(arr_sort[j * 2 + 1] > arr_sort[j * 2 + 2]){arr_sort[j] = arr_sort[j * 2 + 1];j = j * 2 + 1;}else{arr_sort[j] = arr_sort[j * 2 + 2];j = j * 2 + 2;}}arr_sort[j] = arr_sort[arr_sort.size() - i - 1];while(arr_sort[j] > arr_sort[(j - 1)/ 2]){swap(arr_sort[j],arr_sort[(j - 1)/2]);j = (j - 1)/2; }arr_sort[arr_sort.size() - i - 1] = tmp;}}void initVec(vector<int> &vec) {srand((unsigned)time(NULL)); int len = rand() % 1000;for(int i = 0; i < len; i ++) {vec.push_back(rand() % 1000);}}void heap_sort(vector<int> &vec) {insert(vec);pop(vec);}void print(vector<int> vec) {for(int i = 0;i < vec.size();i ++) {cout << vec[i] << " ";}cout << endl;}int main(){int nums = 10;while(nums --) {vector <int> arr1;vector <int> arr2;initVec(arr1);arr2 = arr1;heap_sort(arr1);sort(arr2.begin(), arr2.end());cout << "the heap_sort result: ";print(arr1);cout << "the correct result: ";print(arr2);for(int i = 0; i < arr1.size(); i ++) {if(arr1[i] != arr2[i]) {cout << "wrong result:" << endl;cout << arr1[i] << " and " << arr2[i] << endl;return 1;}}cout << "correct result!" << endl;}return 0;}

View Code

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。