快速排序:快速排序的思想是选择第一个元素作为基准值,用其他元素与该元素作比较,分为小于和大于两个区间,并将这俩个数组重复使用快速排序的思想,直至元素个数小于2返回并合并这些区间。
步骤:
- 选择基准值。
- 将数组分成两个子数组:小于基准值的元素和大于基准值的元素。
- 对这两个子数组进行快速排序。
- 重复步骤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)。
小结:
- 快速排序将问题逐步分解。使用快速排序处理列表时,基线条件很可能是空数组或只包含一个元 素的数组。
- 实现快速排序时,请随机地选择用作基准值的元素。快速排序的平均运行时间为O(n log n)。
- 比较简单查找和二分查找时,常量几乎无关紧要,因为列表很长时,O(log n)的速度比O(n) 快得多。