前端常见排序

快速排序

var quickSort = function (arr) {
  if (arr.length <= 1) return arr;
  var pivotIndex = Math.floor(arr.length / 2);
  var pivot = arr.splice(pivotIndex, 1)[0];
  var left = [];
  var right = [];
  for (var i = 0; i < arr.length; i++) {
    if (arr[i] < pivot) {
      left.push(arr[i]);
    } else {
      right.push(arr[i]);
    }
  }
  return quickSort(left).concat([pivot], quickSort(right));
};

function quickSort(arr) {
  if (arr.length <= 1) return arr;
  const left = [];
  const right = [];
  const mid = arr.shift();

  arr.forEach((item) => {
    if (item <= mid) left.push(item);
    else right.push(item);
  });

  return quickSort(left).concat(mid).concat(quickSort(right));
}

二分查找是我们目前为止遇到的第一个时间复杂度为 O(logn) 的算法。

冒泡排序

var sort = (arr) => {
  for (let i = 0; i < arr.length - 1; i++) {
    for (let j = 0; j < arr.length - 1 - i; j++) {
      if (arr[j] > arr[j + 1]) {
        let swap = arr[j];
        arr[j] = arr[j + 1];
        arr[j + 1] = swap;
      }
    }
  }
  return arr;
};
var arr = [32, 12, 56, 78, 76, 45, 36];
sort(arr);
console.log(arr);

归并排序

// 归并排序算法, A是数组,n表示数组大小
merge_sort(A, n) {
  merge_sort_c(A, 0, n-1)
}

// 递归调用函数
merge_sort_c(A, p, r) {
  // 递归终止条件
  if p >= r  then return

  // 取p到r之间的中间位置q
  q = (p+r) / 2
  // 分治递归
  merge_sort_c(A, p, q)
  merge_sort_c(A, q+1, r)
  // 将A[p...q]和A[q+1...r]合并为A[p...r]
  merge(A[p...r], A[p...q], A[q+1...r])
}


merge(A[p...r], A[p...q], A[q+1...r]) {
  var i = p,j = q+1,k = 0 // 初始化变量i, j, k
  var tmp = new array[0...r-p] // 申请一个大小跟A[p...r]一样的临时数组
  while( i<=q  &&  j<=r  ){
    if A[i] <= A[j] {
      tmp[k++] = A[i++] // i++等于i=i+1
    } else {
      tmp[k++] = A[j++]
    }
  }

  // 判断哪个子数组中有剩余的数据
  var start = i,end = q
  if (j<=r) { start = j, end:=r}

  // 将剩余的数据拷贝到临时数组tmp
  while start <= end do {
    tmp[k++] = A[start++]
  }

  // 将tmp中的数组拷贝回A[p...r]
  for i:=0 to r-p do {
    A[p+i] = tmp[i]
  }
}

插入排序

function sort(elements) {
  for (var i = 1; i < elements.length; i++) {
    if (elements[i] < elements[i - 1]) {
      // 取出无序数列中第i个作为被插入元素
      var gurd = elements[i];
      //记住有序数列的最后一个位置,并且将有序数列位置扩大一个
      var j = i - 1;
      // 比大小, 找到被插入元素所在的位置
      while (j >= 0 && gurd < elements[j]) {
        elements[j + 1] = elements[j];
        j--;
      }
      elements[j + 1] = gurd;
    }
  }
}

最后更新于

这有帮助吗?