Heap排序法
选择排序法基本概念为,每次从未排序的部分选出最小值,插入已排序的后端,其时间主要花费在整个未排序的部分寻找最小值,要让加快寻找,Heap排序是不错的选择。
Heap排序法让搜寻的路径由树根至最后一个树叶,而不是整个未排序的部分,因而称之为改良的选择排序。
Heap Sort只需一个记录的大小辅助空间,每个待排序的记录仅占一个存储空间。若再输出堆顶的最小值后,使得n-1个元素的序列又重新建立成一个堆,则得到n个元素中的次小值。如此反复执行,便得到一个有序序列,这个过程称の为堆排序。
堆排序技巧部分在于为每个结点建一个索引。可以使用一维阵列来存储堆积树中所有元素于其顺序,为了方便计算,使用的起始索引是1而不是0。索引1是根,若左子节点索引为s,则右子节点为s+1,父节点为s/2。
程序实现:(C++)
#include<iostream>
#include<ctime>
#include<cstdlib>
using namespace std;
#define MAX 10
#define SWAP(x,y){int t; t = x; x=y; y= t;}
void creatheap(int[]);
void heapsort(int[]);
int main(void)
{
int number[MAX+1] = {-1};
srand(time(NULL));
cout<<"排序前:\n";
for(int i = 1;i<=MAX;i++)
{
number[i] = rand()%100;
cout<<number[i]<<" ";
cout<<"\n ";
}
cout<<"\n建立堆积树 :";
creatheap(number);
for(i= 1;i<=MAX;i++)
cout<<number[i]<<" \n";
heapsort(number);
return 0;
}
void creatheap(int number[]) //建立最小堆
{
int s,p;
int heap[MAX+1] = {-1};
for(int i = 1;i<=MAX;i++)
{
heap[i] = number[i];
s = i;
p = i/2;
while(s>=2&&heap[p]>heap[s])
{
SWAP(heap[p],heap[s]);
s = p;
p = s/2;
}
}
for(i=1;i<=MAX;i++)
number[i] = heap[i];
}
void heapsort(int number[])
{
int m,p,s;
m = MAX;
while(m>1)
{
SWAP(number[1],number[m]);
m--;
p = 1;
s = 2*p;
while(s<=m)
{
if(s<m&&number[s+1]<number[s]) //为了和小父节点的比较
s++;
if(number[p]<=number[s])
break;
SWAP(number[p],number[s]); //重新吧p赋值为s 然后调整为最小堆
p = s;
s = 2*p;
}
cout<<"\n排序中:";
for( int i = MAX;i>0;i--)
cout<<number[i]<<" ";
}
}
排序法:改良的选择排序
最新推荐文章于 2021-09-11 11:42:14 发布