我的Java開發學習之旅------>Java經典排序演算法之選擇排序,------java
一、演算法原理對比數組中前一個元素跟後一個元素的大小,如果後面的元素比前面的元素小則用一個變數k來記住他的位置,接著第二次比較,前面“後一個元素”現變成了“前一個元素”,繼續跟他的“後一個元素”進行比較如果後面的元素比他要小則用變數k記住它在數組中的位置(下標),等到迴圈結束的時候,我們應該找到了最小的那個數的下標了,然後進行判斷,如果這個元素的下標不是第一個元素的下標,就讓第一個元素跟他交換一下值,這樣就找到整個數組中最小的數了。然後找到數組中第二小的數,讓他跟數組中第二個元素交換一下值,以此類推。
二、演算法分析1.時間複雜度選擇排序的交換操作介於 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值較小時,選擇排序比冒泡排序快。2.穩定性選擇排序是給每個位置選擇當前元素最小的,比如給第一個位置選擇最小的,在剩餘元素裡面給第二個元素選擇第二小的,依次類推,直到第n-1個元素,第n個元素不用選擇了,因為只剩下它一個最大的元素了。那麼,在一趟選擇,如果一個元素比當前元素小,而該小的元素又出現在一個和當前元素相等的元素後面,那麼交換後穩定性就被破壞了。比較拗口,舉個例子,序列5 8 5 2 9,我們知道第一遍選擇第1個元素5會和2交換,那麼原序列中兩個5的相對前後順序就被破壞了,所以選擇排序是一個不穩定的排序演算法。三 、演算法示範
四、代碼實現
public class SelectSort {public static void selectSort(int[] a) {int minIndex = 0;int temp = 0;if ((a == null) || (a.length == 0))return;for (int i = 0; i < a.length - 1; i++) {minIndex = i;// 無序區的最小資料數組下標for (int j = i + 1; j < a.length; j++) {// 在無序區中找到最小資料並儲存其數組下標if (a[j] < a[minIndex]) {minIndex = j;}}if (minIndex != i) {// 如果不是無序區的最小值位置不是預設的第一個資料,則交換之。temp = a[i];a[i] = a[minIndex];a[minIndex] = temp;}System.out.println("第" + (i + 1) + "趟:");printArray(a);}}private static void printArray(int[] source) {for (int i = 0; i < source.length; i++) {System.out.print("\t" + source[i]);}System.out.println();}public static void main(String[] args) {int[] source = { 70,30,40,10,80,20,90,100,75,60,45};System.out.println("初始關鍵字:");printArray(source);selectSort(source);System.out.println("\n\n排序後:");printArray(source);}}
五、運行結果
初始關鍵字:70304010802090100756045第1趟:10304070802090100756045第2趟:10204070803090100756045第3趟:10203070804090100756045第4趟:10203040807090100756045第5趟:10203040457090100756080第6趟:10203040456090100757080第7趟:10203040456070100759080第8趟:10203040456070751009080第9趟:10203040456070758090100第10趟:10203040456070758090100排序後:10203040456070758090100
==================================================================================================
作者:歐陽鵬 歡迎轉載,與人分享是進步的源泉!
轉載請保留原文地址:http://blog.csdn.net/ouyang_peng
==================================================================================================