java排序(4) 選擇類排序

2021-07-27 13:53:11 字數 3052 閱讀 7293

設所排序序列的記錄個數為n。i取1,2,…,n-1,從所有n-i+1個記錄(ri,ri+1,…,rn)中找出排序碼最小的記錄,與第i個記錄交換。執行n-1趟 後就完成了記錄序列的排序。(選擇待排數列最小的數排在待排數列首位)

(1)從待排序序列中,找到關鍵字最小的元素;

(2)如果最小元素不是待排序序列的第乙個元素,將其和第乙個元素互換;

(3)從餘下的 n - 1 個元素中,找出關鍵字最小的元素,重複(1)、(2)步,直到排序結束。

* 方法名:choosesort

* 詳述:選擇排序

*@author: nowuseeme

*/public

static

void

choosesort(int numbers)

}//交換位置

if(position != i)}}

測試:

@test

public

void

testchoosesort();

allsorts.choosesort(numbers);

allsorts.printarr(numbers);

}

結果:

1 2 3 4 5 5 6 7 8 9
移動資料的次數已知(n-1 次)

比較次數多。不穩定。演算法複雜度為n^2

堆是一棵順序儲存的完全二叉樹。

其中每個結點的關鍵字都不大於其孩子結點的關鍵字,這樣的堆稱為小根堆。

其中每個結點的關鍵字都不小於其孩子結點的關鍵字,這樣的堆稱為大根堆。

堆排序是一種樹形選擇排序,是對直接選擇排序的有效改進。

堆的定義下:具有n個元素的序列 (h1,h2,…,hn),當且僅當滿足(hi>=h2i,hi>=2i+1)或(hi<=h2i,hi<=2i+1) (i=1,2,…,n/2)時稱之為堆。在這裡只討論滿足前者條件的堆。由堆的定義可以看出,堆頂元素(即第乙個元素)必為最大項(大頂堆)。完全二 叉樹可以很直觀地表示堆的結構。堆頂為根,其它為左子樹、右子樹。

思想:初始時把要排序的數的序列看作是一棵順序儲存的二叉樹,調整它們的儲存序,使之成為乙個 堆,這時堆的根節點的數最大。然後將根節點與堆的最後乙個節點交換。然後對前面(n-1)個數重新調整使之成為堆。依此類推,直到只有兩個節點的堆,並對 它們作交換,最後得到有n個節點的有序序列。從演算法描述來看,堆排序需要兩個過程,一是建立堆,二是堆頂與堆的最後乙個元素交換位置。所以堆排序有兩個函式組成。一是建堆的滲透函式,二是反覆呼叫滲透函式實現排序的函式。

(1)初始化堆:根據初始陣列去構造初始堆(構建乙個完全二叉樹,保證所有的父結點都比它的孩子結點數值大)。

(2)每次交換第乙個和最後乙個元素,輸出最後乙個元素(最大值),然後把剩下元素重新調整為大根堆。

(3)當輸出完最後乙個元素後,這個陣列已經是按照從小到大的順序排列了。

} // 根據輸入陣列構建乙個最大堆

private

static

void

buildmaxheap(integer data)

} //堆調整,使其生成最大堆

private

static

void

maxheapify(integer data, int parentnodeindex, int heapsize)

// 如果右子節點比最大節點還大,那麼最大節點應該是右子節點

if (rightchildnodeindex <= heapsize && data[rightchildnodeindex - 1]>data[largestnodeindex - 1])

// 最後,如果最大節點和父節點不一致,則交換他們的值

if (largestnodeindex != parentnodeindex)

} }

測試:

@test

public

void

testheapsort();

heapsort.sort(numbers);

for(int i=0;iout.print(numbers[i]+" ");

} }

結果:

3 7 8 16 17 20
堆的儲存表示是順序的。因為堆所對應的二叉樹為完全二叉樹,而完全二叉樹通常採用順序儲存方式。

當想得到乙個序列中第k個最小的元素之前的部分排序序列,最好採用堆排序。

因為堆排序的時間複雜度是o(n+klog2n),若k≤n/log2n,則可得到的時間複雜度為o(n)。

堆排序是一種不穩定的排序方法。

因為在堆的調整過程中,關鍵字進行比較和交換所走的是該結點到葉子結點的一條路徑,因此對於相同的關鍵字就可能出現排在後面的關鍵字被交換到前面來的情況。

4 選擇排序

public static void main string args selectsort arr 相當於兩個陣列,只不過長度不同,乙個是i到arr.length 乙個是i 1到arr.length public static void selectsort int arr 每一次迴圈完畢找到最小...

Java 選擇排序

public static void selectsort int a int n a.length int minindex 0 從無序區中選乙個最小的數放在有序區的最後,初始時認為整個陣列都是無序的,選乙個最小的數放到第一位 for int i 0 i 直接選擇排序和插入排序類似,都將資料分為有...

選擇排序 JAVA

選擇排序原理 每次選定乙個位置的數,依此和後續位置的數比較,如果選定的數大於後面的數,則交換 第一次選擇出最小值,第二次從第二個位置開始比 共比較n 1輪,每輪比較n i 1次 int a new int for int times 0 times a.length 1 times 上述 在在一輪比...