排序:对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来操作
}
最小优先级队列支持的操作类似,应用最小堆,用在基于事件驱动的模拟器中。