1. 程式人生 > >The palest ink is better than the best memory

The palest ink is better than the best memory

選擇排序
它的工作原理是每一次從待排序的資料元素中選出最小(或最大)的一個元素,存放在序列的起始位置,直到全部待排序的資料元素排完。 選擇排序是不穩定的排序方法(比如序列[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的相對前後順序就被破壞了,所以選擇排序是一個不穩定的排序演算法。