# 选择排序
选择排序可以看作是冒泡排序的一种优化。在冒泡排序的过程中,会做许多无用的数据交换,因为在冒泡排序里,交换数据只能保证当前两个数据的正确排序位置,但很可能不是最后的排序位置。 也就是说,之后这个两个数据可能还需要和其其它数据交换位置,才能得到最后的结果。这样就会产生许多无用的数据交换操作,这也是冒泡排序效率不高的一个原因。 选择排序集针对这一点做了优化,它依然想冒泡排序那样比较数据,不同之处在于,在满足数据交换的条件时,并不立即进行数据交换的操作,而是记录该数据的位置,当该数据与所有的数据比较完成后,最后在进行数据交换的操作。
# 算法逻辑
具体实现过程如下((假设需要排序的数据存在一个数组变量array里面,左往右,从小到大排序):
- 设置变量 i=0 ;
- 取 temp=i,j=i;
- 从数组元素第j个元素开始循环。
- 比较 array[temp]>array[j] ? ,若 array[temp]>array[j] 为真,那么 temp=j,j=j+1 ;
- 如果 j>=array.length ,则结束循环,否则继续执行 4-5 ;
- 交换数组元素 array[i] 和 array[temp] 的值, i=i+1 ;
- 如果 i>=array.length ,则结束循环,得到的数据就是完成排序的数组,否则继续执行 2-6 步;
# 代码实现
function chooseSort(array) {
var temp = -1;
for (var i = 0; i < array.length; i++) {
//寻找i以及i元素之后,最小的数组元素
temp = i;
for (var j = i; j < array.length; j++) {
if (array[temp] > array[j]) {
temp = j;
}
}
//每次内存循环最多交换一次
if (temp != j) {
var tempData = array[i];
array[i] = array[temp];
array[temp] = tempData;
}
}
return array;
}
# 总结
选择排序的效率会比冒泡的效率高(在排序的数据量非常大的情况下),因为他减少了许多无用的数据交换操作,而数据交换操作相对于数据比较操作是很耗时的。选择排序的时间复杂度为O(n^2),算法稳定。