排序算法-常用的排序算法

常用的排序算法

  1. 冒泡排序O(n^2)
  2. 选择排序O(n^2)
  3. 插入排序O(n^2)
  4. 快速排序O(nlogn)
  5. 归并排序O(nlogn)

以下我们用Javascript语言来实现上面的算法

冒泡排序
function bubbleSort(arr) {
  var length = arr.length;
  for (var i = 0; i < length; i++) {
    for (var j = 0; j < length - i - 1; j++) {
      if (arr[j] > arr[j + 1]) {
        var temp = arr[j];
        arr[j] = arr[j + 1];
        arr[j + 1] = temp;
      }
    }
  }
  return arr;
}
console.log('冒泡排序O(n^2) ', bubbleSort([7, 5, 6, 1, 2, 3, 4]))
// [1,2,3,4,5,6,7]

例子:
第1步:[7, 5, 6, 1, 2, 3, 4] => [5, 7, 6, 1, 2, 3, 4]
第2步: => [5, 6, 7, 1, 2, 3, 4]
第3步: => [5, 6, 1, 7, 2, 3, 4]
第4步: => [5, 6, 1, 2, 7, 3, 4]
第5步: => [5, 6, 1, 2, 3, 7, 4]
第6步: => [5, 6, 1, 2, 3, 4, 7]
最后一个值为最大值7,然后遍历 [5, 6, 1, 2, 3, 4] 寻找第二大值放置7前面,以此类推,重复以上步骤,完成排序。

选择排序
function selectionSort(arr) {
  var length = arr.length;
  for (var i = 0; i < length; i++) {
    for (var j = i + 1; j < length; j++) {
      if (arr[i] > arr[j]) {
        var temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
      }
    }
  }
  return arr;
}
console.log('选择排序O(n^2) ', selectionSort([7, 5, 6, 1, 2, 3, 4]))
// [1,2,3,4,5,6,7]

例子:
第1步:[7, 5, 6, 1, 2, 3, 4] => [5, 7, 6, 1, 2, 3, 4]
第2步: => [5, 7, 6, 1, 2, 3, 4]
第3步: => [1, 7, 6, 5, 2, 3, 4]
第4步: => [1, 7, 6, 5, 2, 3, 4]
第5步: => [1, 7, 6, 5, 2, 3, 4]
第6步: => [1, 7, 6, 5, 2, 3, 4]
红色表示每次比较的值,如果前面的大于后面的就进行交换。

插入排序
function insertSort(arr) {
  var length = arr.length;
  for (var i = 1; i < length; i++) {
    for (var j = 0; j < i; j++) {
      if (arr[i] < arr[j]) {
        var temp = arr.splice(i, 1)[0];
        arr.splice(j, 0, temp);
        break;
      }
    }
  }
  return arr;
}
console.log('插入排序O(n^2) ', insertSort([7, 5, 6, 1, 2, 3, 4]))
// [1,2,3,4,5,6,7]
快速排序
function quickSort(arr) {
  var length = arr.length;
  function dfs(left, right) {
    var x = left, y = right;
    var dir = true; // true: right--; false: left++;
    var current = arr[left]; // 当前值,左边小,右边大
    while (left < right) {
      if (dir) {
        if (current > arr[right]) {
          arr[left] = arr[right];
          dir = false;
        }
      } else {
        if (current < arr[left]) {
          arr[right] = arr[left];
          dir = true;
        }
      }
      if (dir) {
        right--;
      } else {
        left++;
      }
    }
    arr[left] = current;

    if (left - x >= 2) {
      dfs(x, left - 1);
    }
    if (y - left >= 2) {
      dfs(left + 1, y);
    }
  }
  dfs(0, length - 1);
  return arr;
}
console.log('快速排序O(nlogn) ', quickSort([4, 5, 6, 1, 2, 3, 7]))
归并排序
function mergeSort(arr) {
  function mergeArr(i, j, a, b, array) {
    var temp = [];
    while (i <= j && a <= b) {
      if (array[i] < array[a]) {
        temp.push(array[i]);
        i++;
      } else {
        temp.push(array[a]);
        a++;
      }
    }
    if (i > j) {
      temp = temp.concat(array.slice(a, b + 1));
    } else {
      temp = temp.concat(array.slice(i, j + 1));
    }
    return temp;
  }
  //
  function dfs(i, j) {
    if (i === j) {
      return { left: i, right: j }
    }
    if (j - i === 1) {
      if (arr[i] > arr[j]) {
        var temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
      }
      return { left: i, right: j };
    }

    var mid = parseInt((i + j) / 2);
    var s1 = dfs(i, mid);
    var s2 = dfs(mid + 1, j);
    // 分治
    if (s1 && s2) {
      var temp = mergeArr(s1.left, s1.right, s2.left, s2.right, arr);
      Array.prototype.splice.apply(arr, [s1.left, s2.right - s1.left + 1].concat(temp));
      return { left: s1.left, right: s2.right }
    }
  }
  dfs(0, arr.length - 1);
  return arr;
}
console.log('归并排序O(nlogn)', mergeSort([4, 5, 6, 1, 2, 3, 7]))

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值