如何选择排序算法

排序算法的时间复杂度和空间复杂度

其中, n表示数据规模(数据量),

           k表示 “桶” 的个数,

           In-place:表示占用常数内存,不占用额外内存,

           Out-place:表示占用内存,

           稳定性:表示排序后2个键值相同的数据顺序和排序前的顺序相同,

           O后面有一个函数,指明某个算法的耗时与耗空间与数据增长量之间的关系,比如时间复杂度O(n),表示数据量增大n倍,耗时也增大n倍。再比如O(log(n)),当数据量增大n倍时,耗时量增大log(n)倍(log以2为基数)。

排序的选择

  1. 如n(<=50)时,可以选择直接插入或者直接选择排序;
  2. 如文件初始状态基本有序(指正序),则应该选用直接插入、冒泡或者随机的快排为宜;
  3. 如n比较大,则选用时间复杂度为O(nlog(n))的排序方法,快速排序、堆排序或者归并排序;
  4. 如n比较小,考虑稳定性,可以使用基数排序、计数排序或者桶排序;
  5. 如数据中重复的比较多,可以使用希尔排序和归并;

例题:2万名员工按年龄由小到大的排序?

  1. 要考虑员工的工号,也就是稳定性;
  2. 数量较多;
  3. 重复较多;

考虑以上因素,选用归并排序;

源码实现

  function merge(left, right) {
    var result = [];
    while (left.length > 0 && right.length >0) {
      if (left[0] < right[0]) {
        result.push(left.shift())
      } else {
        result.push(right.shift())
      } 
    }
    return result.concat(left).concat(right)
  }
function mergeSort(arr) {
    if (arr.length === 1) {
      return arr
    }
  var mid = Math.floor(arr.length / 2);
  var left_arr = arr.slice(0, mid);
  var right_arr = arr.slice(mid);
  return merge(mergeSort(left_arr), mergeSort(right_arr))
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值