day1 快排 全排列

78 阅读1分钟

day1

快排

1

var quicksort = function (arr) {
  if (arr.length <= 1) {
    return arr;
  }
  var middleindex = Math.floor(arr.length / 2); //取数组中间数的下标
  var middle = arr.splice(middleindex, 1)[0]; //取数组中间值,但splice方法对数组进行拷贝操作最坏复杂度为O(n)  我也不知道为啥是O(n)
  var left = [];
  var right = [];
  for (let i = 0; i < arr.length; i++) {    //遍历数组将数组元素以中间值区分放入左右两边
    if (arr[i] < middle) {
      left.push(arr[i]);
    } else {
      right.push(arr[i]);
    }
  }
  return quicksort(left).concat([middle], quicksort(right)); //递归左右两边的数组继续进行排序然后拼接返回
};

好像截图好看一点 image.png

2

function swap(arr, i, j) {
  //交换数组元素
  const t = arr[i];
  arr[i] = arr[j];
  arr[j] = t;
}
function sort(arr, left, right) {
  const pivot = arr[right - 1]; //用于比较的数
  let i = left - 1;
  for (let j = left; j < right - 1; j++) {
    //相当于获取数组小于基准的那部分,即0到i,所以遍历数组进行比较然后只要小于基准,则利用指针将值替换到对应的位置
    if (arr[j] <= pivot) {
      i++;
      swap(arr, i, j);
    }
  }
  swap(arr, i + 1, right - 1);
  return i + 1;
}
function quicksort2(arr, left = 0, right) {
  //总的思想是取出一个基准pivot将数组分为两块,然后再在两块分别递归排序
  right = right || arr.length;
  if (left < right - 1) {
    const temp = sort(arr, left, right);
    quicksort2(arr, left, temp);
    quicksort2(arr, temp + 1, right);
  }
  return arr;
}

image.png

全排列

function quan(str) {
  var result = [];
  if (str.length == 1) {
    result.push(str);
  } else {
    for (let i = 0; i < str.length; i++) {
      var a = str[i];
      var rest = str.slice(0, i) + str.slice(i + 1, str.length);
      var lastresult = quan(rest);
      for (let i = 0; i < lastresult.length; i++) {
        var tmp = a + lastresult[i];
        result.push(tmp);
      }
    }
  }

  return result;
}

image.png