算法(2)堆排序
2017-12-01 11:25
260 查看
堆排序的操作时这样的:
//Heapfy
有三个指针(不是C里的物理指针)指向堆中的父结点和左右结点,分别是idx(父),left,right 。
还有一个largest指向 这三者中最大的那个。
如果,idx不等于largest,则交换 array[idx]和array[largets]的值,然后从largest开始向后递归。
注意:这只是完成一次,父>左右结点的操作,并不是整个排序完成,说到底,这个操作只是把小的数放到下面的叶子去了。
//buildHeap
排序的时候,从一半的位置向前调用Heapfy,因为一半的后面都是前面的子结点
以下程序部分借鉴 http://blog.csdn.net/moxiaomomo/article/details/6331386
#include <iostream>
using namespace std;
void Heapfy(int A[],int idx,int max) //建立最大堆
{
int left=idx*2+1;
int right=left+1;
int largest;
if(left<max&&A[left]>A[idx])
largest=left;
else
largest=idx;
if(right<max&&A[largest]<A[right])
largest=right;
if(largest!=idx)
{
int temp=A[largest]; //较大的节点值将交换到其所在节点的父节点
A[largest]=A[idx];
A[idx]=temp;
Heapfy(A,largest,max); //递归遍历
}
}
void buildHeap(int A[],int ll)
{
int len=ll;
for(int i=len/2-1;i>=0;--i) //从一半的位置开始向前,因为一半后面的都是前面的子节点
{
Heapfy(A,i,len); //建立最大堆,将堆中最大的值交换到根节点
}
for(int i=len-1;i>=1;--i)
{
int temp=A[0]; //将当前堆的根节点交换到堆尾的指定位置
A[0]=A[i];
A[i]=temp;
Heapfy(A,0,i); //建立下一次的最大堆
}
}
void show_array(int *a,int len)
{
cout<<endl;
for(int i=0;i<len;i++)
cout<<a[i]<<" ";
cout<<endl;
}
int main()
{
int array[6]={18,10,9,22,1,3};
show_array(array,6);
buildHeap(array,6);
show_array(array,6);
return 0;
}
//Heapfy
有三个指针(不是C里的物理指针)指向堆中的父结点和左右结点,分别是idx(父),left,right 。
还有一个largest指向 这三者中最大的那个。
如果,idx不等于largest,则交换 array[idx]和array[largets]的值,然后从largest开始向后递归。
注意:这只是完成一次,父>左右结点的操作,并不是整个排序完成,说到底,这个操作只是把小的数放到下面的叶子去了。
//buildHeap
排序的时候,从一半的位置向前调用Heapfy,因为一半的后面都是前面的子结点
以下程序部分借鉴 http://blog.csdn.net/moxiaomomo/article/details/6331386
#include <iostream>
using namespace std;
void Heapfy(int A[],int idx,int max) //建立最大堆
{
int left=idx*2+1;
int right=left+1;
int largest;
if(left<max&&A[left]>A[idx])
largest=left;
else
largest=idx;
if(right<max&&A[largest]<A[right])
largest=right;
if(largest!=idx)
{
int temp=A[largest]; //较大的节点值将交换到其所在节点的父节点
A[largest]=A[idx];
A[idx]=temp;
Heapfy(A,largest,max); //递归遍历
}
}
void buildHeap(int A[],int ll)
{
int len=ll;
for(int i=len/2-1;i>=0;--i) //从一半的位置开始向前,因为一半后面的都是前面的子节点
{
Heapfy(A,i,len); //建立最大堆,将堆中最大的值交换到根节点
}
for(int i=len-1;i>=1;--i)
{
int temp=A[0]; //将当前堆的根节点交换到堆尾的指定位置
A[0]=A[i];
A[i]=temp;
Heapfy(A,0,i); //建立下一次的最大堆
}
}
void show_array(int *a,int len)
{
cout<<endl;
for(int i=0;i<len;i++)
cout<<a[i]<<" ";
cout<<endl;
}
int main()
{
int array[6]={18,10,9,22,1,3};
show_array(array,6);
buildHeap(array,6);
show_array(array,6);
return 0;
}
相关文章推荐
- 【算法导论】堆排序和优先级队列
- 白话经典算法系列之七 堆与堆排序
- 老老实实复习算法: 4 堆排序
- 算法:堆排序
- 《算法(第四版)》排序-----堆排序
- 算法-->堆排序
- 堆排序(算法导论第六章)
- 第16周 项目1-验证算法(6)堆排序
- 第十六周项目1-(6)验证算法选择排序之堆排序
- 算法实现系列第二章.堆排序
- 算法学习——堆排序
- 【数据结构与算法】内部排序之三:堆排序(含完整源码)
- 白话经典算法系列之七 堆与堆排序
- 算法基础 大根堆与堆排序
- 基本算法之堆排序
- 白话经典算法系列之七 堆与堆排序
- C语言对堆排序一个算法思路和实现代码
- 有趣算法-堆排序学习整理
- 基本算法_堆排序_Java实现
- 算法----堆排序(heap sort)