簡單選擇排序(Java實現)
阿新 • • 發佈:2019-02-01
基本概念:
在要排序的一組數中,選出最小的一個數與第1個位置的數交換;然後在剩下的數當中再找最小的與第2個位置的數交換,依次類推,直到第n-1個元素(倒數第二個數)和第n個元素(最後一個數)比較為止。簡單選擇排序的特點為:交換移動資料次數少,比較次數多。
下面給出具體的程式碼:
package javastudy;
public class XuanZeSort {
public void selectionSort(int A[], int n) {
//簡單選擇排序演算法,排序結果為遞增陣列
int min;//陣列下標min永遠指向每次集合比較中最小元素
//外層迴圈:n-1次
//需要注意到的是:陣列的最大下標比陣列的長度小1且陣列的下標從0開始
for(int i=0;i<n-1;i++)
{
min = i;//給min賦初值,為陣列的0號元素的下標
/**
* 第二層迴圈:迴圈n-1次
* j=i+1:初次比較的時候,i是靠前的那個元素 j是兩個數字中靠後的那個元素
*/
for(int j=i+1;j<n;j++)
{ /**
當前面的數字大於後面的數字的時候 ,把後門數字的下標
賦值給min,保證下標min永遠指向兩個數字中最小的那一個
最終一輪比較下來,min指向的是集合元素比較當中最小的那一個元素
**/
if(A[min]>A[j])
{
min = j;
}
}
/**
* 如果min和i相等 也就是每一次的集合最前面的那個數字就是最小的
* 那麼我們就不需要再進行交換 這樣效率和穩定性更加高
*/
if(i!=min)
{
swap(A,i,min);
}
}
}
/**
*
* 交換函式
*
*
*/
public void swap(int A[], int i, int j) {
int temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
主函式來呼叫一下:
package javastudy;
public class MainTest {
public static void main(String[] args) {
XuanZeSort sort = new XuanZeSort();
int A[] = {10,5,1,2,4,3,9,6};
sort.selectionSort(A, A.length);
for(int i=0;i<A.length;i++)
{
System.out.print(A[i]+" ");
}
}
}
控制檯輸出結果為:
1 2 3 4 5 6 9 10
達到了預期的目的
我們現在來分析一下最優情況下的複雜度和最差情況下的複雜度:
1.最優情況下:
排序的數字就是按照升序順序排序的,我們發現外層迴圈和內層迴圈各要執行n-1次
所以複雜度為:o(n^2)
2.最差情況下:
排序的數字是降序順序開始排序的,我們發現外層迴圈和內層迴圈還是各要執行n-1次
所以複雜度為:o(n^2);
3.平均時間複雜度為:o(n^2)
綜上所述,無論什麼情況下,簡單選擇排序的時間複雜度為o(n^2);