1. 程式人生 > >選擇排序算法

選擇排序算法

樹形 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)初始建堆所需的次數較多,因此記錄數較少,因此記錄數較少時不宜采用。

選擇排序算法