一個Java小白通向數據結構算法之旅(5) - 選擇排序

前言

今天去東鵬特飲面試,我很生氣。面的技術崗,卷子竟然是營銷的。浪費了我一晚上的時間,害得我差點沒趕上地鐵的末班車。你能敢相信?這是面Java的試卷。生氣歸生氣,學習還是要繼續的。

image.png

什么是選擇排序?

選擇排序是不穩定的排序。每一趟從待排序的數據元素中選出最小(或者最大)的一個元素放在已排好序的數列的最后,直到全部待排序的數據排完。


選擇排序和冒泡排序的區別

  • 選擇排序相對于冒泡來說,它不是每次發現逆序都要進行交換。

  • 選擇排序改進了冒泡排序,將必要的交換次數從O(N^2)減少到O(N)。但是比較的次數還是O(N^2)

  • 選擇排序在為大記錄量的排序中提出了一個非常重要的改進。因為這些記錄需要在內存中移動,這就使交換的時間和比較的時間相比起來,交換的時間更為很重要。在Java語言中不是這種情況,Java中只是改變了引用位置,而實際對象的位置并沒有發生改變。


提取思想

  • 進行選擇排序就是先遍歷所有的數字掃描一趟,從中挑出最小的數據。最小的數字和隊列最左邊的數字進行交換位置,即站到0號位置。現在最左端的數字都是有序的,不需要再進行交換位置了。

  • 在這個算法中,有序的數字都排列在隊列的最左邊,而冒泡排序則是排序在隊列最右邊。

  • 再次遍歷數據隊列時,就從第1號位置開始了,還是尋找剩下隊列中最小的數據,然后和第1號位置的數字進行交換。重復以上過程,一直持續到所有的隊員都排定。


手寫代碼

public class SelectSortDemo {
    public static int[] a = { 11, 20, 5, 4, 8, 14, 2, 10, 20, 9 };

    public static void main(String[] args) {
        sort();
        display();
    }

    public static void sort() {
        int count = a.length;

        for (int i = 0; i < count - 1; i++) {
            int min = i;

            for (int k = i + 1; k < count; k++) {
                if (a[k] < a[min]) {
                    min = k;
                }
            }

            if (min != i) {
                swap(min, i);
            }
        }
    }

    public static void swap(int x, int y) {
        int temp = a[x];
        a[x] = a[y];
        a[y] = temp;
    }

    public static void display() {
        int count = a.length;

        for (int i = 0; i < count; i++) {
            System.out.print(a[i] + " ");
        }
        System.out.println("");
    }
}
  • 運行結果,看輸出。


    image.png

效率問題

選擇排序和冒泡排序都執行了相同次數的比較: N * (N - 1) / 2。對于10個數據項,需要45次比較。然而10個數據項只需要少于10次交換。選擇排序和冒泡排序一樣運行了O(N^2)時間。但是,選擇排序會更快。因為它進行的交換少的很。當N值較小的時候,如果交換的時間級要比比較的時間級大的多時候,選擇排序是相當快的。


尾言

今天女朋友跟我說,面試的時候不要帶任何主觀色彩情緒。女朋友說的很對,我需要再耐心一點,少一點浮躁,多一點沉淀。實話說,我是一個很愛抱怨的人,可是這往往是弱者的表現。在成為強者的路上,我缺的不僅僅是知識,更多的是如何做人。時間也不早了,晚安,地球人。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 概述排序有內部排序和外部排序,內部排序是數據記錄在內存中進行排序,而外部排序是因排序的數據很大,一次不能容納全部的...
    Luc_閱讀 2,309評論 0 35
  • 概述 排序有內部排序和外部排序,內部排序是數據記錄在內存中進行排序,而外部排序是因排序的數據很大,一次不能容納全部...
    蟻前閱讀 5,223評論 0 52
  • 概述:排序有內部排序和外部排序,內部排序是數據記錄在內存中進行排序,而外部排序是因排序的數據很大,一次不能容納全部...
    每天刷兩次牙閱讀 3,747評論 0 15
  • 2016年初,我和朋友去看了劉若英在杭州的演唱會。這是迄今為止第一次去看演唱會,不知道以后還會不會再看,不過即使這...
    Paula_Fan閱讀 637評論 0 1
  • 數一數,可能有十多年了吧,大學畢業到現在十一年了,沒有做好什么,失去的卻越來越多,把自己當成一個老人去看越來越多越...
    一樽還酹江月閱讀 154評論 0 0