The palest ink is better than the best memory
阿新 • • 發佈:2019-01-03
選擇排序:
它的工作原理是每一次從待排序的資料元素中選出最小(或最大)的一個元素,存放在序列的起始位置,直到全部待排序的資料元素排完。 選擇排序是不穩定的排序方法(比如序列[5, 5, 3]第一次就將第一個[5]與[3]交換,導致第一個5挪動到第二個5後面)。
演算法原理
1.首先從原始資料中選擇選擇最小的1個數據,將其和位於第1個位置的資料交換
2.接著從剩下的n-1個數據中選擇次小的一個元素,將其和第2個位置的資料交換
3.不斷重複,直到最後兩個資料完成交換.
程式碼:
public class Demo {
static final int SIZE=10;
public static void selectSort(int[] a)
{
int index,temp;
//依次找剩餘資料中最小的一個
for (int i = 0; i < a.length-1; i++)
{
index = i;
for (int j = i+1; j <a.length; j++)
{
if (a[j] < a[index])
{
index = j;
}
}
//交換兩個數
if(index!=i)
{
temp=a[i];
a[i]=a[index];
a[index]=temp;
}
System.out.print("第"+i+"步排序結果:"); //輸出每步排序的結果
for(int h=0;h<a.length;h++)
{
System.out.print(" "+a[h]); //輸出
}
System.out.print("\n");
}
}
public static void main(String[] args)
{
int[] shuzu=new int[SIZE];
int i;
for(i=0;i<SIZE;i++)
{
shuzu[i]=(int)(100+Math.random()*(100+1)); //初始化陣列
}
System.out.print("排序前的陣列為:\n"); //輸出排序前的陣列
for(i=0;i<SIZE;i++)
{
System.out.print(shuzu[i]+" ");
}
System.out.print("\n");
selectSort(shuzu); //排序操作
System.out.print("排序後的陣列為:\n");
for(i=0;i<SIZE;i++)
{
System.out.print(shuzu[i]+" "); //輸出排序後的陣列
}
System.out.print("\n");
}
}
時間複雜度
選擇排序的交換操作介於 0 和 (n - 1) 次之間。選擇排序的比較操作為 n (n - 1) / 2 次之間。選擇排序的賦值操作介於 0 和 3 (n - 1) 次之間。
比較次數O(n^2),比較次數與關鍵字的初始狀態無關,總的比較次數N=(n-1)+(n-2)+…+1=n*(n-1)/2。交換次數O(n),最好情況是,已經有序,交換0次;最壞情況交換n-1次,逆序交換n/2次。交換次數比氣泡排序少多了,由於交換所需CPU時間比比較所需的CPU時間多,n值較小時,選擇排序比氣泡排序快。
穩定性
選擇排序是給每個位置選擇當前元素最小的,比如給第一個位置選擇最小的,在剩餘元素裡面給第二個元素選擇第二小的,依次類推,直到第n-1個元素,第n個元素不用選擇了,因為只剩下它一個最大的元素了。那麼,在一趟選擇,如果一個元素比當前元素小,而該小的元素又出現在一個和當前元素相等的元素後面,那麼交換後穩定性就被破壞了。比較拗口,舉個例子,序列5 8 5 2 9,我們知道第一遍選擇第1個元素5會和2交換,那麼原序列中兩個5的相對前後順序就被破壞了,所以選擇排序是一個不穩定的排序演算法。