快速排序
简单实现:
注:快排的时间复杂度为O(nlgn)~O(n^2) ,由于使用递归调用栈空间复杂度为O(lgn),快排中相等数值排序之后前后位置可能发生变化,因此为非稳定排序。123456789101112131415161718function quicksort(arr) { if (arr.length <= 1) { return arr; } else { var key = Math.floor(arr.length / 2), left = [], right = []; var key = arr.splice(key, 1)[0]; for (var i = 0; i < arr.length; i++) { if (arr[i] < key) { left.push(arr[i]); } else { right.push(arr[i]); } } return quicksort(left).concat([key], quicksort(right)); }}
小结:
它是图灵奖得主C. A. R. Hoare(1934–)于1960时提出来的。
排序的思路分为三步:
- 选择基准值;
- 遍历整个数组,小于基准值的数放在基准左边,否则放在基准右边;
- 左右两边的子集进一步分别进行以上两步,直到所有子集数组中只有一个数字为止。
上例中为方便起见选取了数据的中间值为基准,下图为网上下载图片,可见到基准值从左到右依次选择,个人还是觉得选择中间值更具有普遍意义,更易理解。
图解:
