快速排序

实现1

var division = (list, left, right) => {
  // 以最左边的数(left)为基准
  var base = list[left];
  while (left < right) {
    // 从序列右端开始,向左遍历,直到找到小于base的数
    while (left < right && list[right] >= base) {
      right--;
    }
    // 找到了比base小的元素,将这个元素放到最左边的位置
    list[left] = list[right];

    // 从序列左端开始,向右遍历,直到找到大于base的数
    while (left < right && list[left] <= base) {
      left++;
    }
    // 找到了比base大的元素,将这个元素放到最右边的位置
    list[right] = list[left];
  }

  // 最后将base放到left位置。此时,left位置的左侧数值应该都比left小;
  // 而left位置的右侧数值应该都比left大。
  list[left] = base;
  return left;
};

var sort = (list, left, right) => {
  // 左下标一定小于右下标,否则就越界了
  if (left < right) {
    // 对数组进行分割,取出下次分割的基准标号
    var base = division(list, left, right);

    // 对“基准标号“左侧的一组数值进行递归的切割,以至于将这些数值完整的排序
    sort(list, left, base - 1);

    // 对“基准标号“右侧的一组数值进行递归的切割,以至于将这些数值完整的排序
    sort(list, base + 1, right);
  }
};

var quickSort = (arr) => {
  sort(arr, 0, arr.length - 1);
};

Python实现

def quicksort(array):
  # 基线条件:为空或只包含一个元素的数组是“有序”的
  if len(array) < 2:
    return array
  else: 
    # 选择第一个元素为基准值
    pivot = array[0]
    # 由所有小于等于基准值的元素组成的子数组
    less = [i for i in array[1:] if i <= pivot]

    # 由所有大于基准值的元素组成的子数组
    greater = [i for i in array[1:] if i > pivot]

    return quicksort(less) + [pivot] + quicksort(greater)

print(quicksort([10,5,2,3]))