算法介绍
首先,从[0,len]中找到数组中最小的元素,让它与第一个元素交换。接着从[1,len]中找出最小的元素,让它与第二个元素交换。循环往复,最终使得数组从小到大排序。
可视化效果:这里
Javascript实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
|
(function (W) {
function Selection(arr) { this.arr = arr; }
Selection.prototype.sort = function () { var len = this.arr.length; for(var i=0;i<len;i++){ var min = i; for(var j=i+1;j<len;j++){ if(this.less(j,min)){ min = j; } } this.exchange(i,min); } };
Selection.prototype.less = function (m,n) { return this.arr[m]<this.arr[n]; };
Selection.prototype.exchange = function (m,n) { var swap = this.arr[m]; this.arr[m] = this.arr[n]; this.arr[n] = swap; };
Selection.prototype.show = function () { console.log(this.arr); };
Selection.prototype.isSorted = function () { var len = this.arr.length; for(var i=1;i<len;i++){ if(this.less(i,i-1)){ return false; } } return true; };
W.Selection = Selection; })(window);
(function () { var arr = [4,5,6,0,3,5,21,7,9,0,1]; var selection = new Selection(arr); console.log("排序前:"+selection.isSorted()); selection.sort(); console.log("排序后:"+selection.isSorted()); selection.show(); })();
|
Java实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| package com.algs;
public class Selection {
public static void sort(int[] arr){ int len = arr.length; for (int i = 0; i < len; i++) { int min = i; for (int j = i+1; j < len; j++) { if (less(arr[j], arr[min])) min = j; } exchange(arr, i, min); } }
private static boolean less(int m,int n) { return m < n; }
private static void exchange(int[] a, int m, int n) { int swap = a[m]; a[m] = a[n]; a[n] = swap; }
public static void show(int[] a){ for (int i = 0; i < a.length; i++) { System.out.print(a[i]+" "); } }
public static void main(String[] args) { int[] arr = {4,5,6,0,3,5,21,7,9,0,1}; Selection.sort(arr); Selection.show(arr); } }
|
总结
运行时间和输入无关。
为了找出最小元素而扫描一遍数组并不能为下一遍扫描提供信息。长度一致,一个有序的数组或值全部相当的数组和一个无序的数组排序所需的时间一致。
数据移动是最少的。
一个长度为N的数组只需要N次交换即可完成排序。
不稳定。
无法保证排序前与排序后重复元素的相对顺序一致。举例:序列[5,8,5,2,9],第一遍选择第1个元素5会和2交换,那么原序列中两个5的相对前后顺序就被破坏了,所以选择排序不是一个稳定的排序算法。
原地排序。
时间复杂度为:平方级别。
空间复杂度为:常数级别。
GitHub:https://github.com/AlbertKnag/algs-practice
上一篇:排序算法01:冒泡排序
下一篇:排序算法03:插入排序
留言
欢迎交流想法。留言会通过 GitHub Issues 保存,首次使用需要登录 GitHub。