C++排序 之 堆排序
- 一、理论知识
- 二、程序与结果
- 2.1 C++代码
- 2.2 运行结果
一、理论知识
以升序为例,堆排序简单来说就是先将原数组调整为大堆,此时根节点的数最大,最后一个叶子节点数最小,所以需将这两个节点的值进行交换,然后保证最后这个叶子节点的数不变,并从根节点开始往下调整,使除最后一个叶子节点之外的数维持大堆状态。同理,继续将调整后的根节点与倒数第二个叶子节点进行交换,然后完成以上操作,以此类推,直至调整到根节点。
具体堆排序的理论只是可见博主的博客 温故而知新 -> 数据结构 ->排序。
同时,因为堆排序基于二叉树的顺序结构存储,因此在代码编写中会利用二叉树的一些性质,若有不懂可见博主的博客 二叉树介绍 ~ 概念、存储结构、性质。
二、程序与结果
2.1 C++代码
#include
#include
using namespace std;void display(vector<int>& arr)
{for (auto& n : arr)cout << n << " ";cout << endl;
}void _heapSort(vector<int>& arr, int len, int idx)
{int left &#61; 2 * idx &#43; 1;int right &#61; 2 * idx &#43; 2;int maxidx &#61; idx;if (left < len && arr[left] > arr[maxidx])maxidx &#61; left;if (right < len && arr[right] > arr[maxidx])maxidx &#61; right;if (maxidx !&#61; idx){swap(arr[maxidx], arr[idx]);_heapSort(arr, len, maxidx);}
}void heapSort(vector<int>& arr)
{int len &#61; arr.size();for (int i &#61; len / 2 - 1; i >&#61; 0; i--)_heapSort(arr, len, i);for (int i &#61; len - 1; i >&#61; 1; i--){swap(arr[0], arr[i]);_heapSort(arr, i, 0);}
}void test()
{vector<int> arr &#61; { 5, 2, 8, 6, 4, 7, 9, 1, 3 };cout << "原数组&#xff1a;";display(arr);heapSort(arr);cout << "堆排序后&#xff1a;";display(arr);
}int main()
{test();return 0;
}
2.2 运行结果