C/C++堆排序

编程入门 行业动态 更新时间:2024-10-11 19:14:58

C/C++堆排序

C/C++堆排序

堆排序

堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

算法描述

  • 将初始待排序关键字序列(R1,R2….Rn)构建成大顶堆,此堆为初始的无序区;
  • 将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2,……Rn-1)和新的有序区(Rn),且满足R[1,2…n-1]<=R[n];
  • 由于交换后新的堆顶R[1]可能违反堆的性质,因此需要对当前无序区(R1,R2,……Rn-1)调整为新堆,然后再次将R[1]与无序区最后一个元素交换,得到新的无序区(R1,R2….Rn-2)和新的有序区(Rn-1,Rn)。不断重复此过程直到有序区的元素个数为n-1,则整个排序过程完成。

动态演示

代码实现

#include <iostream>
#include <vector>
#include <algorithm>using namespace std;// 递归方式构建大根堆(len是arr的长度,index是第一个非叶子节点的下标)
void adjust(vector<int>& arr, int index,int len) {int left = 2 * index + 1;int right = 2 * index + 2;//通过递归,反复调整使其满足堆int maxindex = index;if (left<len && arr[left]>arr[maxindex]) maxindex = left;if (right<len && arr[right]>arr[maxindex])maxindex = right;if (maxindex != index) {swap(arr[maxindex], arr[index]);adjust(arr, maxindex,len);}
}
//堆排序
void heapsort(vector<int>&arr) {//构建大根堆int len = arr.size();for (int i = len / 2 - 1; i >= 0; i--) {adjust(arr, i, len);}//不断调整大根堆for (int i = len - 1; i >= 1; i--) {swap(arr[i], arr[0]);adjust(arr, 0, i);}
}
void print_arr(vector<int>& arr) {int n = arr.size();for (int i = 0; i < n; i++) {cout << arr[i] << "  ";}cout << endl;
}
int main() {vector<int> arr = { 9,5,6,8,7,4,2,3,1 };cout << "排序前:" << endl;print_arr(arr);heapsort(arr);cout << "排序后:" << endl;print_arr(arr);system("pause");return 0;
}

结果输出

更多推荐

C/C++堆排序

本文发布于:2023-07-28 19:12:51,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1284010.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!