# 选择排序

选择排序可以看作是冒泡排序的一种优化。在冒泡排序的过程中,会做许多无用的数据交换,因为在冒泡排序里,交换数据只能保证当前两个数据的正确排序位置,但很可能不是最后的排序位置。 也就是说,之后这个两个数据可能还需要和其其它数据交换位置,才能得到最后的结果。这样就会产生许多无用的数据交换操作,这也是冒泡排序效率不高的一个原因。 选择排序集针对这一点做了优化,它依然想冒泡排序那样比较数据,不同之处在于,在满足数据交换的条件时,并不立即进行数据交换的操作,而是记录该数据的位置,当该数据与所有的数据比较完成后,最后在进行数据交换的操作。

# 算法逻辑

具体实现过程如下((假设需要排序的数据存在一个数组变量array里面,左往右,从小到大排序):

  1. 设置变量 i=0 ;
  2. 取 temp=i,j=i;
  3. 从数组元素第j个元素开始循环。
  4. 比较 array[temp]>array[j] ? ,若 array[temp]>array[j] 为真,那么 temp=j,j=j+1 ;
  5. 如果 j>=array.length ,则结束循环,否则继续执行 4-5 ;
  6. 交换数组元素 array[i] 和 array[temp] 的值, i=i+1 ;
  7. 如果 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),算法稳定。