選擇排序算法
阿新 • • 發佈:2017-08-10
樹形 logs 父親 cti aps 結點之間 最大 堆排序 heap
選擇排序的基本思想是:每一趟從待排序的記錄中選出關健字最小的記錄,按順序放在已排序的記錄序列的最後,直到全部排完為止。
簡單選擇排序(Simple Selection Sort)也稱作直接選擇排序
代碼如下
void SelectSort(int[] list){ for(int i=0;i<list.length;i++){ int min=list[i]; int t=i; for(int j=i;j<list.length;j++){ if(min>list[j]){ min=list[j]; t=j; } } list[t]=list[i]; list[i]=min; } }
算法時間復雜度O(n2)空間復雜度為1
算法特點
(1)就選擇排序方法本身來講,它是一種穩定的排序方法
(2)可用於鏈式存儲
(2)移動次數較少,當每一記錄占用的空間較多時,此方法比直接插入排序快
堆排序算法
堆排序(Heap Sort)是一種樹形選擇排序,在排序過程中,將待排序的記錄r[1...n]看成是一顆完全二叉樹的順序存儲結構,利用完全二叉樹中雙親結點和孩子結點之間的內在關系,在當前無序的序列中選擇關鍵字最大(或最小)的記錄。
算法如下
public void heapAdjust(int H[],int start,int end){ int temp=H[start]; for(int i=2*start+1;i<=end;i*=2){ if(i<end&&H[i]<H[i+1]){ ++i; } if(temp>H[i]){ //左右孩子中獲勝者與父親的比較 break; } //將孩子結點上位,則以孩子結點的位置進行下一輪的篩選 H[start]=H[i]; start=i; } H[start]=temp;//插入最開始不和諧的元素 } void heapSort(int A[],int n){ //先建立大頂堆 for(int i=n/2;i>=0;--i){ heapAdjust(A,i,n); } //進行排序 for(int i=n-1; i>0; --i) { //最後一個元素和第一元素進行交換 int temp=A[i]; A[i] = A[0]; A[0] = temp; //然後將剩下的無序元素繼續調整為大頂堆 heapAdjust(A,0,i-1); } }
時間復雜度為O(nlog2 n) 空間復雜度為O(1).
算法特點
(1)是不穩定
(2)只能用於順序結構,不能用於鏈式
(3)初始建堆所需的次數較多,因此記錄數較少,因此記錄數較少時不宜采用。
選擇排序算法