跳至內容

選擇排序

本頁使用了標題或全文手工轉換
維基百科,自由的百科全書
選擇排序
選擇排序動畫演示
選擇排序動畫演示
概況
類別排序演算法
資料結構數組
複雜度
平均時間複雜度
最壞時間複雜度
最佳時間複雜度
空間複雜度總共,需要輔助空間
最佳解偶爾出現
相關變數的定義
選擇排序的範例動畫。紅色表示當前最小值,黃色表示已排序序列,藍色表示當前位置

選擇排序(英語:Selection sort)是一種簡單直觀的排序演算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。

選擇排序的主要優點與資料移動有關。如果某個元素位於正確的最終位置上,則它不會被移動。選擇排序每次交換一對元素,它們當中至少有一個將被移到其最終位置上,因此對個元素的表進行排序總共進行至多次交換。在所有的完全依靠交換去移動元素的排序方法中,選擇排序屬於非常好的一種。

實作範例

[編輯]

C語言

[編輯]
void selection_sort(int a[], int len) 
{
    int i,j,temp;

	for (i = 0 ; i < len - 1 ; i++) 
    {
		int min = i;
		for (j = i + 1; j < len; j++)     //走訪未排序的元素
		{
			if (a[j] < a[min])    //找到目前最小值
			{
				min = j;    //紀錄最小值
			}
		}
		if(min != i)
		{
		  temp=a[min];  //交換兩個變數
		  a[min]=a[i];
		  a[i]=temp;
		}
	   	/* swap(&a[min], &a[i]);  */   //做交換
	}
}

/*
void swap(int *a,int *b) //交換兩個變數
{
    int temp = *a;
    *a = *b;
    *b = temp;
}
*/

Java

[編輯]
public class SelectionSort  {
	public void sort(int[] arr) {
		int minIndex;
		for(int i = 0;i < arr.length;i++) {
			minIndex = i;
			//遍历找出未排序中的元素中最小值下标
			for(int j = i;j < arr.length;j++) {
				if(arr[j] < arr[minIndex]) {
					minIndex = j;
				}
			}
			//若最小值下标与未排序中最左侧下标不一致则交换
			if(minIndex != i) {
				int temp = arr[i];
				arr[i] = arr[minIndex];
				arr[minIndex] = temp;
			}
		}
	}
}
# Julia Sample:SelectionSort
function SelectionSort(A)
	for i=1:length(A)
		min=i
		for j=i+1:length(A)
			min=A[j]<A[min]?j:nothing   # Get Min
			if min!=i
              A[min],A[i]=A[i],A[min]   # Swap
			end
		end
	end
	return A
end

# Main Code
A = [16,586,1,31,354,43,3]
println(A)              		# Original Array
println(SelectionSort(A))       # Selection Sort Array

Python

[編輯]
def selection_sort(list1):
    longs = len(list1)
    
    for i in range(longs-1):
        idx = i
        
        for j in range(i, longs):
            if list1[j] < list1[idx]:
                idx = j
                
        if idx != i:
            list1[i], list1[idx] = list1[idx], list1[i]

複雜度分析

[編輯]

選擇排序的交換操作介於次之間。選擇排序的比較操作次。選擇排序的賦值操作介於次之間。


比較次數,比較次數與關鍵字的初始狀態無關,總的比較次數。交換次數,最好情況是,已經有序,交換0次;最壞情況是,逆序,交換次。交換次數比泡沫排序較少,由於交換所需CPU時間比比較所需的CPU時間多,值較小時,選擇排序比泡沫排序快。

原地操作幾乎是選擇排序的唯一優點,當空間複雜度要求較高時,可以考慮選擇排序;實際適用的場合非常罕見。

外部連結

[編輯]