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

2021-09-27 12:05:43 字數 1829 閱讀 8079

這裡的測試資料來自於之前自己隨便寫的生成器

#include

using namespace std;

intmain()

int t =

10, arr[20]

;while

(t--

)return0;

}

/*-----簡單選擇排序-----*/

void

selectsort

(int arr,

int n)

if(min != i)

}}

簡單選擇排序

空間複雜度

使用常數個輔助單元,空間複雜度為o(1)

時間複雜度

最好情況:初始序列已經有序,無需選擇交換,但是比較次數為∑ (n-i) = n*(n-1)/2 次,時間複雜度為o(n²)

最壞情況:比較次數與序列的初始狀態無關,依舊為∑ (n-i) = n*(n-1)/2 次,時間複雜度為o(n²)

平均情況:時間複雜度為o(n²)

穩定性

最小元素可能和相同元素中相對位置在前的元素互換,例如,最終排序為,因此是不穩定

/*-----堆排序-----*/

void

buildmaxheap

(int arr,

int len)

;void

adjustdown

(int arr,

int k,

int len)

;void

heapsort

(int arr,

int len)

}void

buildmaxheap

(int arr,

int len)

void

adjustdown

(int arr,

int k,

int len)

} arr[k]

= arr[0]

;}

堆排序

?什麼是堆?

實質:完全二叉樹的順序儲存結構

這裡採用的是大根堆演算法

?什麼是大根堆?

大根堆的性質:雙親結點的值大於其兒子節點的值

即l[ i ] > l[ 2i ] 且 l[i] > l[ 2i+1 ] (1 <= i <= n/2)

空間複雜度

使用常數個輔助單元,空間複雜度為o(1)

時間複雜度

建堆buildmaxheap() 時間為o(n)

之後有 n-1 次向下調堆adjustdown() 操作,每次調整時間為o(h),對完全二叉樹而言,h=log₂n向上取整,所以調堆過程時間為o((n-1)*log₂n),時間複雜度為o(nlogn)

在最好、最壞和平均情況下都是o(nlogn)

穩定性

關鍵字調整過程中,相同元素的相對位置可能會發生改變,因此是不穩定

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

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

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

選擇排序的基本思想 每一趟 例如第i趟 在後面n i 1 i 1,2,n 1 個待排序元素中選取關鍵字最小的元素,作為有序子串行的第i個元素,直到第n 1趟做完,待排序元素只剩下了1個,就不用再選了。1.簡單選擇排序 簡單排序演算法思想 假設排序表為l 1 n 第i趟排序即從l i n 中選擇關鍵字...

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

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