堆排序的实现C++
1.概述
1991年计算机先驱将获得者、斯坦福大学计算机科学系教授Robert W.Floyd和J. Williams在1964年共同发明了著名的Heap Sort算法。
堆排血实质上就是将要进行排序的序列Arr[1..n]看做是一棵完全二叉树的存储结构,堆则是满足如下性质的完全二叉树:
问题:从十亿个数中取出前十个最大的数。(只想到用该算法去实现了,如果有更好的实现方法,可以share)
程序:
// HeapSort.h头文件
class HeapSort {
public:
HeapSort();
HeapSort(const HeapSort& orig);
virtual ~HeapSort();
void shift(int r[], int i, int m);
void heapSortint(int array[],int n);
private:
};
// HeapSort.cpp文件
#include "heapsort.h"
using namespace std;
HeapSort::HeapSort() {
}
HeapSort::HeapSort(const HeapSort& orig) {
}
HeapSort::~HeapSort() {
}
void HeapSort::shift(int k[], int i, int n)
{
int j;
int temp=k[i];
j=2*i;
while(j<=n)
{
if(j<n&&k[j]<k[j+1])//确定两个孩子结点中较大的
j++;
if(temp>=k[j])
break;
k[j/2]=k[j];
j=2*j;
}
k[j/2]=temp;
}
void HeapSort::heapSortint(int k[], int n)
{
int temp;
for (int index=n/2; index>0;index--)//初始堆积从第n/2个元素开始自底向上实现
shift(k,index,n);
for(int i=n-1;i>=1;i--)// 调整实现
{
temp=k[i+1];
k[i+1]=k[1];
k[1]=temp;
shift(k,1,i);
}
}
// main寒素
#include "heapsort.h"
#include "iostream"
#include "stdlib.h"
using namespace std;
int main(void)
{
int n=10;
int a[]={0,26,5,77,1,61,11,59,15,48,19};
HeapSort hs;
hs.heapSortint(a,n);
cout<<"HeapSorted Array :"<<endl;
for(int i=1;i<=10;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
}
1991年计算机先驱将获得者、斯坦福大学计算机科学系教授Robert W.Floyd和J. Williams在1964年共同发明了著名的Heap Sort算法。
堆排血实质上就是将要进行排序的序列Arr[1..n]看做是一棵完全二叉树的存储结构,堆则是满足如下性质的完全二叉树:
2. 编辑环境(1)堆排序与直接选择排序的区别
- 树中任一非叶结点的关键字均不大于(或不小于)器左右孩子(若存在)结点的关键字。(如果按照数组中线性存储该树,可得到一个既不是单调递增也不是单调递减的序列)
- 直接排序的缺点:直接选择排序过程中,为从Arr[1..n]中选择出关键字最大的记录,必须进行n-1次比较,然后在Arr[2...n]中选出关键字最大的记录,又需要做n-2次比较。事实上,后面的n-2次比较中,有许多比较可能在前面n-1比较中已经做成的,但是由于前一趟比较过程中未保留这些比较结果,所以后一趟排序执行了这些比较操作。
- 堆排序:堆排序可以通过树型结构保存部分比较结果,从而可以大大减少比较的次数。
(2)大堆排序的基本思想且满足Arr[1..n-i]<Arr[...n]
- 首先将Arr[1..n]建成一个大根堆,此堆为初始的无序区。
- 再将关键字最大的记录Arr[i]和无序区的最后一个记录Arr[n]交换,由此道道了一个新的无序区Arr[1..n-i]和有序区Arr[...n],
(3)该算法的分析
- 由于交换后新的根Arr[i]可能违反堆性质,故应将当前无序区Arr[1..n-i]调整为堆,重复执行第二部的操作,最后直到无序区只有一个元素为止。
堆排序法的时间主要花费在将原始序列调整为一个初始堆积以及排序过程中不断将移走最大值元素以后剩余的那些元素重新调整为一个新的堆两部上。
所以,该方法对于n较大的数据元素序列是很合适的。
- NetBeans C++ 6.5
- Window XP
问题:从十亿个数中取出前十个最大的数。(只想到用该算法去实现了,如果有更好的实现方法,可以share)
程序:
// HeapSort.h头文件
class HeapSort {
public:
HeapSort();
HeapSort(const HeapSort& orig);
virtual ~HeapSort();
void shift(int r[], int i, int m);
void heapSortint(int array[],int n);
private:
};
// HeapSort.cpp文件
#include "heapsort.h"
using namespace std;
HeapSort::HeapSort() {
}
HeapSort::HeapSort(const HeapSort& orig) {
}
HeapSort::~HeapSort() {
}
void HeapSort::shift(int k[], int i, int n)
{
int j;
int temp=k[i];
j=2*i;
while(j<=n)
{
if(j<n&&k[j]<k[j+1])//确定两个孩子结点中较大的
j++;
if(temp>=k[j])
break;
k[j/2]=k[j];
j=2*j;
}
k[j/2]=temp;
}
void HeapSort::heapSortint(int k[], int n)
{
int temp;
for (int index=n/2; index>0;index--)//初始堆积从第n/2个元素开始自底向上实现
shift(k,index,n);
for(int i=n-1;i>=1;i--)// 调整实现
{
temp=k[i+1];
k[i+1]=k[1];
k[1]=temp;
shift(k,1,i);
}
}
// main寒素
#include "heapsort.h"
#include "iostream"
#include "stdlib.h"
using namespace std;
int main(void)
{
int n=10;
int a[]={0,26,5,77,1,61,11,59,15,48,19};
HeapSort hs;
hs.heapSortint(a,n);
cout<<"HeapSorted Array :"<<endl;
for(int i=1;i<=10;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
}
posted on 2009-10-11 15:44 Creative Common 阅读(2088) 评论(0) 编辑 收藏 举报