選擇排序是一種最簡單的排序方式,主要的思想:
首先,找到數組中最小的那個數及其下標,將最小的這個數與數組第一個數交換位置,那麼這個最小的數就在數組的第一個位置了,然後從數組第二個位置開始尋找最小的數,找到後與數組的第二個位置的數進行交換,如果沒找到,就自己交換自己。反覆下去,就得到了排序的數組。這種方法就叫選擇排序,因爲它總是在不選的選擇剩餘元素的最小值。
案例圖示:
代碼
public static void select(int[] a)
{
for (int i=0;i<a.length;i++)
{
int temp=a[i];//將未排序的第一個元素存到temp
int k=i;//將未排序的第一個元素的下標保存到k
int p;//作爲兩個元素交換的過渡值
for (int j=i+1;j<a.length;j++)
{
if(temp<a[j])//找出未排序元素的最小值和下標
{
temp=a[j];
k=j;
}
}
//如果未排序的第一個元素本身就是最小值了,那麼此時的i與k就是相等的,相當於自身交換
p=a[i];
a[i]=temp;
a[k]=p;
}
}
兩個特點:
1.運行時間與輸入無關,因爲不論是亂序數組還是已經有序的數組,它都會進行比較和交換。
2.數據移動是最少的,每次交換都會改變兩個數組元素的值,因此如果數組大小是N的話,就交換了N次,因此交換次數與數組大小成線性關係
時間複雜度分析:
爲了確定數組第一個位置的元素,需要比較N-1次,確定數組第二個位置的元素,需要比較N-2次,以此類推,總共需要比較(N-1)+(N-2)+......+2+1=N*(N-1)/2,所以時間複雜度爲