排序法:改良的选择排序

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]<<" ";
}
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值