前言
今天去東鵬特飲面試,我很生氣。面的技術崗,卷子竟然是營銷的。浪費了我一晚上的時間,害得我差點沒趕上地鐵的末班車。你能敢相信?這是面
Java
的試卷。生氣歸生氣,學習還是要繼續的。
什么是選擇排序?
選擇排序是不穩定的排序。每一趟從待排序的數據元素中選出最小(或者最大)的一個元素放在已排好序的數列的最后,直到全部待排序的數據排完。
選擇排序和冒泡排序的區別
選擇排序相對于冒泡來說,它不是每次發現逆序都要進行交換。
選擇排序改進了冒泡排序,將必要的交換次數從
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值較小的時候,如果交換的時間級要比比較的時間級大的多時候,選擇排序是相當快的。
尾言
今天女朋友跟我說,面試的時候不要帶任何主觀色彩情緒。女朋友說的很對,我需要再耐心一點,少一點浮躁,多一點沉淀。實話說,我是一個很愛抱怨的人,可是這往往是弱者的表現。在成為強者的路上,我缺的不僅僅是知識,更多的是如何做人。時間也不早了,晚安,地球人。