算法导论之排序和顺序统计学

排序:对N个数的序列重排过程。待排序的数,一般是选择记录中数据集的关键字key作为排序的值,而数据集中其他数据(称为:卫星数据)以key为中心移动。实际上,对于排序过程中,key的移动和交换,卫星数据并不定跟着,只要记录的指针随key交换即可,将数据移动量减小到最小。

关键字和卫星数据所构成的数据集,在实际排序应用中,不单只关注关键字序列,还关心卫星数据的存储结构,在选用具体排序算法中有一定考量。排序算法分为:

1)比较排序:插入排序、合并排序、堆排序、快速排序,对数组中的元素进行比较来实现排序;

2)非比较排序:计数排序、基数排序,利用非比较的其他方法来获得数组的排序信息;

每种排序算法都要考量其运行时间和存储空间的性能,各有其应用优点。插入排序的最坏情况运行时


1)Maximum(S),返回S中最大关键字的元素,在最大堆A中返回根节点即可,算法如下:

Fun_heap_maximum(A){

   return A[1];

}

2)Extract_max(S),去掉并返回S中最大关键字的元素,在最大堆A中去掉最大值后需要重新调整保持最大堆性质,算法如下:

Fun_heap_extractmax(A){

   max=A[1];//返回最大值

   A[1]=A[heapsize[A]];//将最后一个节点的值,交换到第一个节点

   Heapsize[A]= Heapsize[A]-1;//堆大小减1

   Fun_max_heapify(A,1);//保持最大堆性质函数

   return max;

}

Fun_max_heapify(A,i){

   l=left(i);

   r=right(i);

   if l<=heapsize[A] and A[l]>A[i]

        then largest=l

        else largest=i

   if r<=heapsize[A] and A[r]>A[largest]

        then largest=r

   if largest ≠ i

        then exchange(A[i],A[largest])

             Fun_max_heapify(A,largest)

}

3)IncreaseKey(S,x,k),将元素x的关键字的值增加到k,在最大堆A中操作就是赋值x元素的新关键字值,并保持堆性质,算法如下:

Fun_heap_IncreaseKey(A,i,key){

   A[i]=key;//赋值key

   while i>1 and A[parent(i)]<A[i]

        do exchange(A[i],A[parent(i)]

        i=parent[i]

}

4)Insert(S,x),新增元素x到集合S,即是插入一个元素关键字key到一个已建成的最大堆A中,插入算法如下:

Fun_maxHeap_Insert(A,key){

    heapsize[A]=heapsize[A]+1;//堆大小加1

    A[heapsize[A]]=-∞;//新增叶节点,关键值为负无穷大

   Fun_heap_IncreaseKey(A, heapsize[A],key);//新增叶子节点插入的值,可按照IncreaseKey来操作

}

最小优先级队列支持的操作类似,应用最小堆,用在基于事件驱动的模拟器中。






















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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值