1. 程式人生 > >選擇排序原理分析與java程式碼實現

選擇排序原理分析與java程式碼實現

1、選擇排序改進了氣泡排序,將必要的交換次數 O(N^2 )減少到 O(N)次(理解選擇排序可以先看一下我的上一篇氣泡排序的部落格)不幸的是比較次數仍然保持為 O(N^2 )。然而,選擇排序仍然為大記錄量的排序提出了一個非常重要的改進,因為這些大量的記錄需要在記憶體中移動,這就使交換的時間和比較的時間相比起來,交換的時間更為重要。(一般來說,在 Java 語言中不是這種情況,Java 中只是改變了引用位置,而實際物件的位置並沒有發生改變。)

選擇排序原理即:在選擇排序中,不再只比較兩個相鄰的資料。因此需要記錄下某一個數據的下標,進行選擇排序就是把所有的資料掃描一遍,從中挑出(按從小到大排序)最小的一個數據,這個最小的資料和最左端下標為

0的資料交換位置。之後再次掃描資料,從下標為1開始,還是挑出最小的然後和1號位置進行交換,這個過程一直持續到所有的資料都排定。而程式中需要有一個標識變數來標識每次挑出最小資料的下標。

2、程式碼實現

public class ArraySort {

    public static void main(String[] args) {

        int[] array = {1, 7, 3, 9, 8, 5, 4, 6};

        array = sort(array);

        for (int i = 0; i < array.length; i++) {

            System.out.println(array[i]);

        }

    }

    public static int[] sort(int[] array) {

        for (int i = 0; i < array.length-1; i++) {

            int temp = i;

            for (int j = i+1; j < array.length; j++) {

                if (array[temp] > array[j]) {

                    temp = j;

                }

            }

            int t = array[temp];

            array[temp] = array[i];

            array[i] = t;

        }

        return array;

    }

}

3、效率

選擇排序和氣泡排序執行了相同次數的比較:N*(N-1)/2。對於 10 個數據項,需要 45 次比較。然而,10 個數據項只需要少於 10次交換。對於 100 個數據項,需要 4950 次比較,但只進行了不到 100 次的交換。N 值很大時,比較次數是主要的,所以結論是選擇排序和氣泡排序一樣運行了 O(N^2)時間。但是,選擇排序無疑更快,因為它進行的交換少得多。當 N 值較小時,特別是如果交換的時間級比比較的時間級大得多時,選擇排序實際上是相當快的。