堆栈排序
来源:互联网 发布:java程序员必备工具 编辑:程序博客网 时间:2024/06/08 08:35
#include "stdafx.h"
#include <iostream>
using namespace std;
int count = 0;
void Swap(int &a,int &b)
{
int temp;
temp = a;
a = b;
b = temp;
}//堆元素上移
void SiftUp(int H[],int i)
{
bool done =false;
if(i != 1)
{
while(!done && i !=1)
{
if(H[i]>H[i/2])
{
Swap(H[i],H[i/2]);
}
else done = true;
i = i/2;
}
}
}
//堆元素下移
void SiftDown(int H[],int n,int i)//i为被下移元素的下标
{
bool done = false;
if((2*i)<=n)
{
while (!done && ( 2*i<=n))
{
i =2*i;
if(i+1<=n && H[i+1]>H[i])
i = i+1;
if(H[i/2]<H[i])
{
Swap(H[i/2],H[i]);
count++;
}
else done = true;
}
}
}
//x为被插入元素的数
void Insert(int H[],int &n, int x)
{
n = n+1;
H[n] = x;
SiftUp(H,n);
}
//建堆;n为数组的个数
void MakeHeap(int A[],int H[],int n)
{
int i,m = 0;
for(i = 0;i <n; i++)
Insert(H,m,A[i+1]);
}
//基于堆的排序
void HeapSort(int H[],int n)
{
int i;
for(i = n ;i >0;i--)
{
Swap(H[1],H[i]);
count++;
SiftDown(H,i-1,1);
}
}
//该堆以数组下标为1开始
int main(int argc, char* argv[])
{
int A[7] = {0,1,2,3,4,5,6};//A[0]不为栈的元素
int H[7];
MakeHeap(A ,H ,6);
HeapSort(H ,6);
for(int i = 1;i<7;i++)
cout<<H[i]<<endl;
cout<<"总共需要交换"<<count<<endl;
return 0;
}
- 堆栈排序
- 排序堆栈
- 堆栈排序算法
- 快速排序中的堆栈深度
- 快速排序中的堆栈深度
- 快速排序中的堆栈深度
- 堆栈 ——堆排序
- C#实现冒泡排序 堆栈 队列
- Cracking coding interview(3.6)堆栈排序
- 面试算法:堆栈元素的在线排序
- 堆栈
- 堆栈
- 堆栈
- 堆栈
- 堆栈
- 堆栈
- 堆栈
- 堆栈
- 股票(随时更新)
- Microsoft .NET Pet Shop 4 架构与技术分析
- csdn的资料不错,就是积分见少,下载不了了
- 利用Word文字型窗体域保护模板
- 嵌入式系统中内存和flash的区别
- 堆栈排序
- Table行选择
- 主流JS库一览
- 回发或回调参数无效
- JAVA AJAX教程第四章—AJAX和MVC的简单结合
- 读出权限 保存用户权限
- [转]SQL 2005中自动生成数据字典
- 突破代理服务器
- [转]SQL2005 自动生成数据字典2