選擇排序
原理:
從頭至尾掃瞄序列,找出最小的乙個元素,和第乙個元素交換,接著從剩下的元素中繼續這種選擇和交換方式,最終得到乙個有序序列。
思路:
在長度為n的無序陣列中,第一次遍歷n-1個數,找到最小的數值與第乙個元素交換;
第二次遍歷n-2個數,找到最小的數值與第二個元素交換;
……第n-1次遍歷,找到最小的數值與第n-1個元素交換,排序完成。
**選擇排序:
演算法分析:
排序演算法:
先從頭遍歷一遍找出最小元素,最小元素和第乙個元素相交換。再從第二個元素遍歷到最後乙個元素找出最大元素,最小元素和第二個元素相交換。直到所有元素都有序為止。
選擇排序的優缺點:
優點:一輪比較只需要換一次位置;
缺點:效率慢,不穩定
時間複雜度
選擇排序的交換操作介於 0 和 (n - 1) 次之間。選擇排序的比較操作為 n (n - 1) / 2 次之間。選擇排序的賦值操作介於 0 和 3 (n - 1) 次之間。比較次數與關鍵字的初始狀態無關,總的比較次數n=(n-1)+(n-2)+…+1=n*(n-1)/2。
綜上所述:選擇排序總的平均時間複雜度為:o(n^2)
比較次數o(n^2),交換次數o(n),最好情況是已經有序,交換0次;最壞情況交換n-1次。交換次數比氣泡排序少多了,由於交換所需cpu時間比比較所需的cpu時間多,n值較小時,選擇排序比氣泡排序快。
演算法穩定性
選擇排序即是給每個位置選擇待排序元素中當前最小的元素。比如給第乙個位置選擇最小的,在剩餘元素裡面給第二個位置選擇次小的,依次類推,直到第n-1個元素,第n個元素不用選擇了,因為只剩下它乙個最大的元素了。
那麼,在選擇時,如果當前鎖定元素比後面乙個元素大,而後面較小的那個元素又出現在乙個與當前鎖定元素相等的元素後面,那麼交換後位置順序顯然改變了。
舉個例子:序列5 8 5 2 9, 我們知道第一趟選擇第1個元素5會與2進行交換,那麼原序列中兩個5的相對先後順序也就被破壞了。
綜上所述:
選擇排序是一種不穩定排序演算法。
c**實現:
#include
#include
//列印函式
void
printarr
(int arr,
int sz)
printf
("\n");
}//選擇排序函式
void
selectsort
(int a,
int n)
//若陣列中真的有比假設的元素還小,就交換
if(i != min)}}
intmain()
;int sz =
sizeof
(arr)
/sizeof
(arr[0]
);int i =0;
printarr
(arr, sz)
;selectsort
(arr, sz)
;printarr
(arr, sz)
;system
("pause");
return0;
}
**生成圖: C 八種基本排序 堆排序(6)
知識擴充 完全二叉樹的特點 從作為第一層的根開始,除了最後一層之外,第n層的元素個數都必須是2的n次方 第一層2個元素,第二層4個,第三層8個,以此類推。每一行的元素都從最左邊開始安放 生成的順序是從上往下,從左往右 兩個元素之間不能有空閒 堆的性質 小根堆與大根堆的定義 堆排序原理 堆頂元素 即二...
C 八種基本排序 插入排序(3)
直接插入排序 原理 將乙個資料插入到已經排好序的有序資料中,從而得到乙個新的 個數加一的有序資料,演算法適用於少量資料的排序。思想 將陣列的第乙個數認為是有序陣列,從前往後 或者從後往前 掃瞄該有序陣列,把陣列中其餘n 1個數,根據數值的大小,插入到有序陣列中,直至陣列中的所有數有序排列為止。直接插...
八種基本排序演算法
1 思路 對尚未排序的各元素從頭到尾依次比較相鄰的兩個元素是否逆序 與欲排順序相反 若逆序就交換這兩元素,經過第一輪比較排序後便可把最大 或最小 的元素排好 然後再用同樣的方法把剩下的元素逐個進行比較,就得到了你所要的順序 可以看出如果有 n 個元素,那麼一共要進行 n 1 輪比較,第 i 輪要進行...