簡單選擇排序
簡單選擇排序
選擇排序(Selection sort)是一種簡單直觀的排序演算法。
它的工作原理是:
1、第一次從待排序的資料元素中選出最小(或最大)的一個元素,存放在序列的起始位置。
2、然後再從剩餘的未排序元素中尋找到最小(大)元素,然後放到已排序的序列的末尾。
3、以此類推,直到全部待排序的資料元素的個數為零。
選擇排序是不穩定的排序方法。
需求:
排序前:{4,6,8,7,9,2,10,1}
排序後:{1,2,4,5,7,8,9,10}
畫圖分析:
第一次迴圈找到最小值1,和arr[0]交換
第二次迴圈找到最小值2,和arr[1]交換
第三次迴圈找到最小值4,和arr[2]交換
…
動畫演示:幫助理解選擇排序的思想
public class ChooseSort {
public static void main(String[] args) {
int[] arr = {4,6,8,7,9,2,10,1};
System.out.println(Arrays.toString(arr));
sort(arr);
System.out.println(Arrays.toString(arr));
}
public static void sort(int[] arr){
//外層迴圈比較輪數: 第一輪比較就可以最小的找出來,放在最前邊(交換)
for(int i = 0;i<arr.length-1;i++) {
//內層迴圈比較次數
/*
* i+1是不和自己比較,找到最小值時前邊就不比較了
* 第一次輪比較4次,第二輪比較3次,依次遞減
*/
for(int j = i+1;j<arr.length;j++) {
if(arr[j]<arr[i]) {
int temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
}
}
}
}
執行結果:
時間複雜度:
選擇排序使用了雙層for迴圈,其中外層迴圈完成了資料交換,內層迴圈完成了資料比較,所以我們分別統計資料交換次數和資料比較次數:
資料比較次數:
(N-1)+(N-2)+(N-3)+…+2+1=((N-1)+1)*(N-1)/2=N^2/2-N/2;
資料交換次數:
N-1
時間複雜度:N2/2-N/2+(N-1)=N2/2+N/2-1;
根據大O推導法則,保留最高階項,去除常數因子,時間複雜度為O(N^2);
穩點性:
選擇排序是給每個位置選擇當前元素最小的,比如給第一個位置選擇最小的,在剩餘元素裡面給第二個元素選擇第二小的,依次類推,直到第n-1個元素,第n個元素不用選擇了,因為只剩下它一個最大的元素了。那麼,在一趟選擇,如果一個元素比當前元素小,而該小的元素又出現在一個和當前元素相等的元素後面,那麼交換後穩定性就被破壞了。
舉個例子,序列5 8 5 2 9,我們知道第一遍選擇第1個元素5會和2交換,那麼原序列中兩個5的相對前後順序就被破壞了,所以選擇排序是一個不穩定的排序演算法
相關文章
- 簡單選擇排序就是簡單~~~排序
- 排序演算法——簡單選擇排序排序演算法
- 選擇排序的簡單理解排序
- 【筆記】簡單選擇排序筆記排序
- 選擇排序就這麼簡單排序
- 簡單選擇排序(Simple Selection Sort)排序
- 資料結構學習筆記-簡單選擇排序資料結構筆記排序
- 【小小前端】前端排序演算法第三期(不簡單選擇排序-堆排序)前端排序演算法
- 選擇排序排序
- 排序之選擇排序排序
- 最簡單易懂的三種排序演算法:冒泡、選擇、插入排序演算法
- 【JS面試向】選擇排序、桶排序、氣泡排序和快速排序簡介JS面試排序
- 選擇排序和快速排序排序
- js選擇排序JS排序
- Java 選擇排序Java排序
- [java]選擇排序Java排序
- 01選擇排序排序
- 選擇排序法排序
- 淺解前端必須掌握的演算法(二):簡單選擇排序前端演算法排序
- 單連結串列的排序(插入,選擇,冒泡)排序
- 排序演算法__選擇排序排序演算法
- 排序演算法:選擇排序排序演算法
- 選擇排序和氣泡排序排序
- 氣泡排序與選擇排序排序
- 氣泡排序和選擇排序排序
- 選擇排序和插入排序排序
- C# 選擇排序C#排序
- 陣列選擇排序陣列排序
- 經典排序之選擇排序(Java)排序Java
- 排序——選擇排序小練習(二)排序
- 排序——選擇排序小練習(一)排序
- 查詢與排序03,選擇排序排序
- jQuery選擇器 標籤選擇元素+css簡單新增移除操作jQueryCSS
- (一)氣泡排序、選擇排序、插入排序排序
- 排序(2)--選擇排序,歸併排序和基數排序排序
- 選擇排序java實現排序Java
- PHP 排序演算法之選擇排序PHP排序演算法
- 圖解選擇排序與插入排序圖解排序