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 簡單選擇排序 空間複雜度 使...