堆排序
来源:互联网 发布:防9158聊天室源码 编辑:程序博客网 时间:2024/06/03 16:48
#include <iostream>
using namespace std;
// 输出当前堆的排序状况
void PrintArray(int data[], int size)
{
for (int i=1; i<=size; ++i)
cout <<data[i]<<" ";
cout<<endl;
}
// 堆化,保持堆的性质
// MaxHeapify让a[i]在最大堆中"下降",
// 使以i为根的子树成为最大堆
void MaxHeapify(int *a, int i, int size)
{
int lt = 2*i, rt = 2*i+1;
int largest;
if(lt <= size && a[lt] > a[i])
largest = lt;
else
largest = i;
if(rt <= size && a[rt] > a[largest])
largest = rt;
if(largest != i)
{
int temp = a[i];
a[i] = a[largest];
a[largest] = temp;
MaxHeapify(a, largest, size);
}
}
// 建堆
// 自底而上地调用MaxHeapify来将一个数组a[1..size]变成一个最大堆
//
void BuildMaxHeap(int *a, int size)
{
for(int i=size/2; i>=1; --i)
MaxHeapify(a, i, size);
}
void HeapSort(int *a, int size)
{
BuildMaxHeap(a, size);
PrintArray(a, size);
int len = size;
for(int i=size; i>=2; --i)
{
int temp = a[1];
a[1] = a[i];
a[i] = temp;
len--;
MaxHeapify(a, 1, len);
cout << "中间过程:";
PrintArray(a, size);
}
}
void main()
{
int size;
int arr[100];
cout << "Input the num of elements: ";
cin >> size;
cout << "Input the elements: ";
for(int i=1; i<=size; ++i)
cin >> arr[i];
cout << endl;
HeapSort(arr, size);
cout << "最后结果:";
PrintArray(arr, size);
}
using namespace std;
// 输出当前堆的排序状况
void PrintArray(int data[], int size)
{
for (int i=1; i<=size; ++i)
cout <<data[i]<<" ";
cout<<endl;
}
// 堆化,保持堆的性质
// MaxHeapify让a[i]在最大堆中"下降",
// 使以i为根的子树成为最大堆
void MaxHeapify(int *a, int i, int size)
{
int lt = 2*i, rt = 2*i+1;
int largest;
if(lt <= size && a[lt] > a[i])
largest = lt;
else
largest = i;
if(rt <= size && a[rt] > a[largest])
largest = rt;
if(largest != i)
{
int temp = a[i];
a[i] = a[largest];
a[largest] = temp;
MaxHeapify(a, largest, size);
}
}
// 建堆
// 自底而上地调用MaxHeapify来将一个数组a[1..size]变成一个最大堆
//
void BuildMaxHeap(int *a, int size)
{
for(int i=size/2; i>=1; --i)
MaxHeapify(a, i, size);
}
void HeapSort(int *a, int size)
{
BuildMaxHeap(a, size);
PrintArray(a, size);
int len = size;
for(int i=size; i>=2; --i)
{
int temp = a[1];
a[1] = a[i];
a[i] = temp;
len--;
MaxHeapify(a, 1, len);
cout << "中间过程:";
PrintArray(a, size);
}
}
void main()
{
int size;
int arr[100];
cout << "Input the num of elements: ";
cin >> size;
cout << "Input the elements: ";
for(int i=1; i<=size; ++i)
cin >> arr[i];
cout << endl;
HeapSort(arr, size);
cout << "最后结果:";
PrintArray(arr, size);
}
- 堆及堆排序
- 堆/堆排序特点
- 【二叉堆、堆排序】
- 二叉堆 & 堆排序
- 二叉堆 & 堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆和堆排序
- 堆排序(最大堆)
- 堆和堆排序
- 堆和堆排序
- 堆及堆排序
- 堆和堆排序
- 堆与堆排序
- 生命之书(推荐阅读)
- php(三)
- 用ComBoBox选择冲减日期
- java关于使用了未经检查或者不安全的操作
- 新版本cocos2d-x工程项目的创建(本版本为cocos2d-x_v2.1.5b)
- 堆排序
- 数据库相关
- struts1+Myeclipse:java.lang.NoSuchMethodError: antlr.collections.AST.getLine()I
- shell脚本中printf小节
- php
- Win7 64bit安装Oracle 10g Server的报错
- R ->Rstudio->Vim->knitr最强R编辑器
- 马踏棋盘(6*6时效率不可忍受,求教!)
- Java学习日记1 接触多线程