排序法:改良的选择排序

                                                                                       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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值