這裡的測試資料來自於之前自己隨便寫的生成器
#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 ...