快速排序

117 阅读1分钟

快速排序:快速排序的思想是选择第一个元素作为基准值,用其他元素与该元素作比较,分为小于和大于两个区间,并将这俩个数组重复使用快速排序的思想,直至元素个数小于2返回并合并这些区间。

步骤

  1. 选择基准值。
  2. 将数组分成两个子数组:小于基准值的元素和大于基准值的元素。
  3. 对这两个子数组进行快速排序。
  4. 重复步骤1、2、3直至子数组个数小于2。

代码

// JavaScript版本
function quicksort(arr) {
    if (arr.length < 2) {
        return arr;
    } else {
        let middle = arr[0];
        let less = [];
        let greater = [];
        for (let i = 1; i < arr.length; i++) {
            if (arr[i] <= middle) {
                less.push(arr[i]);
            } else {
                greater.push(arr[i]);
            }
        }
        return [...quicksort(less), middle, ...quicksort(greater)];
    }
}
//python版本
def quicksort(array): 
 if len(array) < 2: // 退出递归的条件:元素个数为0或者1
 return array 
 else: 
 mid = array[0]  // 基准值
 less = [i for i in array[1:] if i <= mid] // 小于的元素区间
 greater = [i for i in array[1:] if i > mid] // 大于的元素区间
 return quicksort(less) + [mid] + quicksort(greater) 
print quicksort([10, 5, 2, 3])

时间复杂度:最差情况O(n * n)。

小结

  1. 快速排序将问题逐步分解。使用快速排序处理列表时,基线条件很可能是空数组或只包含一个元 素的数组。
  2. 实现快速排序时,请随机地选择用作基准值的元素。快速排序的平均运行时间为O(n log n)。
  3. 比较简单查找和二分查找时,常量几乎无关紧要,因为列表很长时,O(log n)的速度比O(n) 快得多。