簡單選擇排序圖解
排序算法是《數據結構與算法》中最基本的算法之一。排序算法可以分爲內部排序和外部排序,內部排序是數據記錄在內存中進行排序,而外部排序是因排序的數據很大,一次不能容納全部的排序記錄,在排序過程中需要訪問外存。常見的內部排序算法有:插入排序、希爾排序、選擇排序、冒泡排序、歸併排序、快速排序、堆排序、基數排序等。以下是選擇排序算法:
選擇排序是一種簡單直觀的排序算法,無論什麼數據進去都是 O(n?) 的時間複雜度。所以用到它的時候,數據規模越小越好。唯一的好處可能就是不佔用額外的內存空間了吧。
1. 算法步驟
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。
再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。
重複第二步,直到所有元素均排序完畢。
2. 動圖演示
代碼實現
JavaScript 代碼實現
實例
function selectionSort(arr) {var len = arr.length;
var minIndex, temp;
for (var i = 0; i < len - 1; i++) {
minIndex = i;
for (var j = i + 1; j < len; j++) {
if (arr[j] < arr[minIndex]) { // 尋找最小的數
minIndex = j; // 將最小數的索引保存
}
}
temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
return arr;
}
Python 代碼實現
實例
def selectionSort(arr):for i in range(len(arr) - 1):
# 記錄最小數的索引
minIndex = i
for j in range(i + 1, len(arr)):
if arr[j] < arr[minIndex]:
minIndex = j
# i 不是最小數時,將 i 和最小數進行交換
if i != minIndex:
arr[i], arr[minIndex] = arr[minIndex], arr[i]
return arr
Go 代碼實現
實例
func selectionSort(arr []int) []int {length := len(arr)
for i := 0; i < length-1; i++ {
min := i
for j := i + 1; j < length; j++ {
if arr[min] > arr[j] {
min = j
}
}
arr[i], arr[min] = arr[min], arr[i]
}
return arr
}
Java 代碼實現
實例
public class SelectionSort implements IArraySort {@Override
public int[] sort(int[] sourceArray) throws Exception {
int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
// 總共要經過 N-1 輪比較
for (int i = 0; i < arr.length - 1; i++) {
int min = i;
// 每輪需要比較的次數 N-i
for (int j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[min]) {
// 記錄目前能找到的最小值元素的下標
min = j;
}
}
// 將找到的最小值和i位置所在的值進行交換
if (i != min) {
int tmp = arr[i];
arr[i] = arr[min];
arr[min] = tmp;
}
}
return arr;
}
}
PHP 代碼實現
實例
function selectionSort($arr){
$len = count($arr);
for ($i = 0; $i < $len - 1; $i++) {
$minIndex = $i;
for ($j = $i + 1; $j < $len; $j++) {
if ($arr[$j] < $arr[$minIndex]) {
$minIndex = $j;
}
}
$temp = $arr[$i];
$arr[$i] = $arr[$minIndex];
$arr[$minIndex] = $temp;
}
return $arr;
}
C 語言
實例
void swap(int *a,int *b) //交換兩個變數{
int temp = *a;
*a = *b;
*b = temp;
}
void selection_sort(int arr[], int len)
{
int i,j;
for (i = 0 ; i < len - 1 ; i++)
{
int min = i;
for (j = i + 1; j < len; j++) //走訪未排序的元素
if (arr[j] < arr[min]) //找到目前最小值
min = j; //紀錄最小值
swap(&arr[min], &arr[i]); //做交換
}
}
C++
實例
template<typename T> //整數或浮點數皆可使用,若要使用物件(class)時必須設定大於(>)的運算子功能void selection_sort(std::vector<T>& arr) {
for (int i = 0; i < arr.size() - 1; i++) {
int min = i;
for (int j = i + 1; j < arr.size(); j++)
if (arr[j] < arr[min])
min = j;
std::swap(arr[i], arr[min]);
}
}
C#
實例
static void selection_sort<T>(T[] arr) where T : System.IComparable<T>{//整數或浮點數皆可使用int i, j, min, len = arr.Length;
T temp;
for (i = 0; i < len - 1; i++) {
min = i;
for (j = i + 1; j < len; j++)
if (arr[min].CompareTo(arr[j]) > 0)
min = j;
temp = arr[min];
arr[min] = arr[i];
arr[i] = temp;
}
}
Swift
實例
import Foundation/// 選擇排序
///
/// - Parameter list: 需要排序的數組
func selectionSort(_ list: inout [Int]) -> Void {
for j in 0..<list.count - 1 {
var minIndex = j
for i in j..<list.count {
if list[minIndex] > list[i] {
minIndex = i
}
}
list.swapAt(j, minIndex)
}
}
原文地址:https://github.com/hustcc/JS-Sorting-Algorithm/blob/master/2.selectionSort.md
參考地址:https://zh.wikipedia.org/wiki/%E9%80%89%E6%8B%A9%E6%8E%92%E5%BA%8F
以下是熱心網友對選擇排序算法的補充,僅供參考:
熱心網友提供的補充1:
Kotlin 實現
class SelectionSort { /** * 拓展IntArray爲他提供數據兩個數交換位置的方法 * @param i 第一個數的下標 * @param j 第二個數的下標 */ fun IntArray.swap(i:Int,j:Int){ var temp=this[i] this[i]=this[j] this[j]=temp } fun selectionSort(array: IntArray):IntArray{ for (i in array.indices){ //假設最小值是i var min=i var j=i+1 while (j in array.indices){ if (array[j]<array[min]){ min=j } j++ } if (i!=min){ array.swap(i,min) } } return array; }}以上爲選擇排序算法詳細介紹,插入排序、希爾排序、選擇排序、冒泡排序、歸併排序、快速排序、堆排序、基數排序等排序算法各有優缺點,用一張圖概括:
關於時間複雜度
平方階 (O(n2)) 排序 各類簡單排序:直接插入、直接選擇和冒泡排序。
線性對數階 (O(nlog2n)) 排序 快速排序、堆排序和歸併排序;
O(n1+§)) 排序,§ 是介於 0 和 1 之間的常數。 希爾排序
線性階 (O(n)) 排序 基數排序,此外還有桶、箱排序。
關於穩定性
穩定的排序算法:冒泡排序、插入排序、歸併排序和基數排序。
不是穩定的排序算法:選擇排序、快速排序、希爾排序、堆排序。
名詞解釋:
n:數據規模
k:"桶"的個數
In-place:佔用常數內存,不佔用額外內存
Out-place:佔用額外內存
穩定性:排序後 2 個相等鍵值的順序和排序之前它們的順序相同
-
移動硬盤壞了上面的數據能恢復嗎
移動硬盤壞了數據能否恢復要看硬盤損壞的程度,如果壞的程度不嚴重,可以通過電腦自動修復。通過電腦自動修復硬盤的方法比較簡單,首先將移動硬盤連接到電腦上,選中移動硬盤,右鍵點擊【屬性】-【工具】-【差錯】-【開始檢查】,勾選【自動修復文件系統錯誤】和【掃描並...
-
汽車均衡器怎麼調音質好
1、首先打開播放器,播放一首歌,選擇均衡器。2、就可以進行相應的設置,在選擇自定義的時候。3、需要了解音樂均衡器的各個頻段所增益的樂器及調節效果,20HZ-40HZ,在這一段中提升能夠使音樂變得強而有力。4、40HZ-150HZ,是聲音的基礎部分,聲音豐滿柔和。...
-
樓上樓下安裝兩個路由器方法,如何樓上樓下安裝兩個路由器
1、兩個無線路由器,主路由器A,副路由器B,主路由器A中不需要任何更改。把副路由器B放在家合適的位置中,接通電源。打開手機連接上副路由器B的WIFI(也可用電腦設置),打開任一瀏覽器,在地址欄中輸入路由器的IP(不同路由器的IP不一樣,具體查看說明書或路由器背面標籤)。2、輸...
-
微信怎麼建,微信的創建方法
1、微信的創建方法:打開微信。點擊更多。選擇註冊。輸入暱稱,手機號和密碼。勾選同意協議。點擊註冊即可。2、微信推薦使用手機號註冊,並支持100餘個國家的手機號。微信不可以通過QQ號直接登錄註冊或者通過郵箱帳號註冊。第一次使用QQ號登陸時,是登陸不了的,只能用...