堆排序
2015-12-04 16:21
218 查看
依旧是作业,这几天写了好多次堆排序了 ,随便放一个上来
#include <iostream>
#include <functional>
#include <ctime>
using namespace std;
template <class T, class Compare = std::less<T> >
void sink(T* arr, int pos, int last) {
int son;
while (pos * 2 <= last) {
son = pos * 2;
if (son != last && Compare()(arr[son], arr[son + 1])) ++son;
if (Compare()(arr[son], arr[pos])) break;
std::swap(arr[son], arr[pos]);
pos = son;
}
}
template <class T, class Compare = std::less<T> >
void heapSort(T* arr, int size) {
int last = size - 1;
for (int i = last / 2; i >= 1; --i)
sink<T, Compare>(arr, i, last);
while (last > 1) {
std::swap(arr[1], arr[last--]);
sink<T, Compare>(arr, 1, last);
}
}
int main()
{
const int sz = 13;
int arr[sz];
srand((unsigned)time(NULL));
cout << "数组是随机产生的" << endl;
for (int i = 1; i < sz; ++i) {
arr[i] = rand() % 100;
}
cout << "排序1:" << endl;
heapSort(arr, sz);
for (int i = 1; i != sz; ++i)
cout << arr[i] << " ";
cout << endl;
cout << "排序2:" << endl;
heapSort<int, std::greater<int> >(arr, sz);
for (int i = 1; i != sz; ++i)
cout << arr[i] << " ";
cout << endl;
return 0;
}
#include <iostream>
#include <functional>
#include <ctime>
using namespace std;
template <class T, class Compare = std::less<T> >
void sink(T* arr, int pos, int last) {
int son;
while (pos * 2 <= last) {
son = pos * 2;
if (son != last && Compare()(arr[son], arr[son + 1])) ++son;
if (Compare()(arr[son], arr[pos])) break;
std::swap(arr[son], arr[pos]);
pos = son;
}
}
template <class T, class Compare = std::less<T> >
void heapSort(T* arr, int size) {
int last = size - 1;
for (int i = last / 2; i >= 1; --i)
sink<T, Compare>(arr, i, last);
while (last > 1) {
std::swap(arr[1], arr[last--]);
sink<T, Compare>(arr, 1, last);
}
}
int main()
{
const int sz = 13;
int arr[sz];
srand((unsigned)time(NULL));
cout << "数组是随机产生的" << endl;
for (int i = 1; i < sz; ++i) {
arr[i] = rand() % 100;
}
cout << "排序1:" << endl;
heapSort(arr, sz);
for (int i = 1; i != sz; ++i)
cout << arr[i] << " ";
cout << endl;
cout << "排序2:" << endl;
heapSort<int, std::greater<int> >(arr, sz);
for (int i = 1; i != sz; ++i)
cout << arr[i] << " ";
cout << endl;
return 0;
}
相关文章推荐
- Spring MVC入门1
- 如何使用css3绘制任意角度扇形+动画
- Android app智能升级(增量更新)_AndroidStudio
- 【转载】Android样式的开发:View Animation篇
- 解决国内pip安装速度慢的问题
- mybatis jdbcType: DATE ,TIMESTAMP 区别:
- 【OpenCV】问题集锦【imread(),imshow()】
- iOS开发技巧--项目中定义宏的相关方法
- 声明中"AutoEventWireup"、"Codebehind"、"Inherits"分别表示什么意思?
- 算法作业5
- GC调优在Spark应用中的实践
- android的org.json.JSONObject的getXXX方法
- 分享给大家一个生成图形验证码的View
- myelcipse中SVN进行代码更新和提交
- 8天学通MongoDB——第七天 运维技术
- for update 和for update nowait
- 原码, 反码, 补码 详解
- Open edX安装Xblock
- 一些工具
- 排它锁 共享锁的区别