選擇類排序 簡單選擇 堆排序

2021-08-19 07:23:34 字數 1696 閱讀 1434

1. 執行過程:

原始序列:49,38,65,97,76,13,27,49 無序

493865

9776

1327

49從無序序列中選取乙個最小的關鍵字13,使其與無序序列中的第乙個關鍵字交換,則此時產生了僅含有乙個關鍵字的有序序列,而無序序列中的關鍵字減少1個,如下:

1338

6597

7649

2749

重複上述步驟,直到無序序列中的關鍵字變為0個為止。

2. 演算法思想:

**:

void selectsort(int r, int n)

temp = r[i];

r[i] = r[k];

r[k] = temp;

}}

3. 複雜度分析:

(1)時間複雜度分析

外層迴圈執行n次,內層迴圈執行n-1次,將最內層迴圈中的比較操作視為關鍵操作,其執行次數為(n-1+1)(n-1)/2=n(n-1)/2,即本演算法的複雜度為o(n²)

(2)空間複雜度為o(1)

1. 概念

堆是一棵順序儲存的完全二叉樹。完全二叉樹中所有非終端節點的值均不大於(或不小於)其左、右孩子節點的值。

2. 基本思想

將待排序的序列構造成乙個大頂堆。此時,整個序列的最大值就是堆頂的根節點。將它移走(其實就是將其與堆陣列的末尾元素交換,此時末尾元素就是最大值),然後將剩餘的 n-1 個序列重新構造成乙個堆,這樣就會得到 n 個元素中次大的值。如此反覆執行,便能得到乙個有序序列了。 

堆排序的實現需要解決的兩個關鍵問題: 

(1)  插入結點

需要在插入結點後保持堆的性質,即完全二叉樹形態與父大子小性質,因此需要先將要插入的結點x放在最底層的最右邊,插入後滿足完全二叉樹的特點;然後把x依次向上調整到合適位置以滿足父大子小的性質。

(2)  刪除結點

當刪除堆中的乙個結點時,原來的位置就會出現乙個孔,填充孔的方法是,把最底層最右邊的葉子的值賦給該孔並下調到合適的位置,最後把該葉子刪除。

3. **

public class heapsort

; system.out.println("排序前:" + arrays.tostring(a));

heapsort(a);

system.out.println("排序後:" + arrays.tostring(a));

}public static void heapsort(int a)

// 將堆頂記錄和當前未經排序子串行的最後乙個記錄交換

for(int i = a.length - 1; i >= 0; i--)

}public static void adjustheap(int a, int i, int len)

a[i] = temp;

}}

4. 複雜度分析:

(1)時間複雜度:o(nlog₂n)

(2) 空間複雜度:o(1)

選擇排序 簡單選擇排序 堆排序

一 簡單選擇排序 對於n個數要進行n次排序,第一次,將最小的數放在第乙個。第二次,將第二小的樹,放在第二個。每次都和後面的數做比較,如果是從小到大的排序,當當前的數字比後面的大時,要進行交換。include void chosesort int a,int length void main int ...

選擇排序 簡單選擇排序和堆排序

1.簡單選擇排序 1 演算法思想 將序列的第乙個元素當作最小的元素,和後面的元素一一比較,將最小的元素下標標記出來,和第乙個元素進行交換,則一趟下來,第乙個元素一定是最小的,直到所有的元素全部排序完成。2 基本實現 void selectsort datatype arr,int sz if k i...

選擇排序 簡單選擇排序和堆排序

這裡的測試資料來自於之前自己隨便寫的生成器 include using namespace std intmain int t 10,arr 20 while t return0 簡單選擇排序 void selectsort int arr,int n if min i 簡單選擇排序 空間複雜度 使...