算法导论之排序和顺序统计学
排序:對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來操作
}
最小優先級隊列支持的操作類似,應用最小堆,用在基于事件驅動的模擬器中。
總結
以上是生活随笔為你收集整理的算法导论之排序和顺序统计学的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Eclipse高版本无法兼容FatJar
- 下一篇: JS获取页面鼠标点击位置的坐标