直接選擇排序是常用選擇排序演算法之一,演算法簡單明瞭,但效能略差。
直接選擇排序演算法實現的思路比較簡單,利用雙層迴圈遍歷的方式篩選出最大(或最小)值,並放置到對應的位置即可。
陣列: a[n] = ;
第一次排序:將第乙個元素值作為最小元素,遍歷後面的陣列,如果當前元素小於最小元素,則交換他們,直到遍歷完成,最小元素被放到了第乙個元素的位置即a[0];空間複雜度:o(1)第二次排序:將第二個元素值作為最小元素,遍歷後面的陣列,如果當前元素小於最小元素,則交換他們,直到遍歷完成,第二小元素被放到了第二個元素的位置即a[1];
……第n-1次排序:a[n-2]為第二大的值,a[n-1]為最大值。
假設陣列為:a[6] = ;
初始:21,30,47,30,1,2
第一次排序:1,30,47,30,21,2
第二次排序:1,2,47,30,30,21
第三次排序:1,2,21,47,30,30
第四次排序:1,2,21,30,47,30
第五次排序:1,2,21,30,30,47
時間複雜度:o(n^2)
穩定性:不穩定,上例可知,排序過程中30和30的相對位置不穩定
優點:演算法簡單,容易實現
缺點:比較、交換次數比較多,效率低
優化:定義min,用來標記最小值的索引,遍歷完成後,若min發生變化,則交換兩個索引的值,否則不交換
package sort;
/** * created by fengjialong on 2019/6/20.
*/public class selectsort
public static void directselectsort() ;
int changetime = 0;
for (int i = 0; i < a.length; i++)
}sysout(a);
}system.out.println("優化前交換次數:" + changetime);
// 優化後
changetime = 0;
int b = ;
for (int i = 0; i < b.length; i++)
}if (i != min)
sysout(b);
}system.out.println("優化後交換次數:" + changetime);
}private static void sysout(int a)
system.out.println(stringbuilder.substring(0, stringbuilder.length() -
1).tostring());
}}
執行結果:
1,30,47,30,21,2
1,2,47,30,30,21
1,2,21,47,30,30
1,2,21,30,47,30
1,2,21,30,30,47
1,2,21,30,30,47
優化前交換次數:7
1,30,47,30,21,2
1,2,47,30,21,30
1,2,21,30,47,30
1,2,21,30,47,30
1,2,21,30,30,47
1,2,21,30,30,47
優化後交換次數:4
常見排序演算法之直接選擇排序
直接選擇排序 straight select sorting 也是一種簡單的排序方法,它的基本思想是 第一次從r 0 r n 1 中選取最小值,與r 0 交換,第二次從r 1 r n 1 中選取最小值,與r 1 交換,第i次從r i 1 r n 1 中選取最小值,與r i 1 交換,第n 1次從r ...
排序演算法(直接選擇排序)
為什麼我們要叫直接選擇排序呢?在最開始的時候,待排序區間是整個陣列,從區間選乙個最小的與區間第乙個交換位置,然後將待排序區間從第二個開始,繼續以上操作,直至待排序區間長度為0 我們還是以為例 初始 3 5 7 9 8 6 2 1 4 0 第一趟 05 7 9 8 6 2 1 4 3 第二趟 0 17...
排序演算法 直接選擇排序
選擇排序的基本思想是 每一趟從待排序的記錄中選出關鍵字最小的記錄,順序放入已排序數列的最後,直到全部記錄排序完畢。直接選擇排序是一種簡單直觀的排序演算法。它的工作原理 首先在未排序序列中找到最小 大 元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小 大 元素,然後放到已排序序列...