您的位置:首页 > 其它

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

2016-06-02 15:23 260 查看
排序:对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来操作

}

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

















内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: