首先说一下快排的基本概念,从一个数组里面选一个基础值,然后将数组里所有大于这个基础值的数放到右边,小于这个基础值的放到左边。
结合着以下观念看下方12张图,理解具体如何实现(可以先看图)
- 将数组的第一个值8,拿出来,作为基础值,并存储到变量number中,让arr[0]空出来以供插入。
- 从右往左开始比,是因为左边arr[0]空了出来,右边要是有比number(也就是8)大的数字,就可以直接移动到arr[0] (如图3,图4)。
- 下标移动只有在: (如图5, 图6)
a. 左下标比number小
b. 右下标比number大 - 否则,不进行移动,如 : (如图3,4 和 图7,8)
a. 右下标比numbe小,则将右下标所指的值,给到左下标指的值,此时,右下标空出,不可移动,供左下标出现大于number时移动。
b. 左下标比number大,则将左下标所致的值,给到右下标的值,此时,左下标空出,不可移动,供右下标出现小于number时移动。 - 当左右下标相等时,此时由前面四点得,左右下标所指的值,应该是空出的,将number放入,就形成了左边都比number小,右边都比number大; (如图11,,12);
图1--------------------------------------------------------------
图2--------------------------------------------------------------
图3--------------------------------------------------------------
图4--------------------------------------------------------------
图5--------------------------------------------------------------
图6--------------------------------------------------------------
图7--------------------------------------------------------------
图8--------------------------------------------------------------
图9--------------------------------------------------------------
图10--------------------------------------------------------------
图11--------------------------------------------------------------
图12--------------------------------------------------------------
function quicksort(arr: number[]): number[] {
if (arr.length === 0 || arr.length === 1) {
return arr;
}
if (arr.length === 2) {
arr[0] > arr[1] && ([arr[0], arr[1]] = [arr[1], arr[0]]);
return arr;
}
let number = arr[0];
let change = 0;
let left = 0;
let right = arr.length - 1;
let s = 0;
while (left < right) {
while (s === 0) {
if (arr[right] < number && left < right) {
arr[change] = arr[right];
change = right;
s = 1;
break;
}
if (left === right) {
arr[change] = number;
break;
}
right--;
}
while (s === 1) {
if (arr[left] > number && left < right) {
arr[change] = arr[left];
change = left;
s = 0;
break;
}
if (left === right) {
arr[change] = number;
break;
}
left++;
}
}
return [
...quicksort(arr.slice(0, change)),
number,
...quicksort(arr.slice(change + 1)),
];
}