快速排序算法思想:
快速排序使用分治法和递归思想来进行操作。分治分治就是分而治之,把大问题化为小问题再进行求解。
首先,给定一个数组,让我们来对数组中的元素进行排序,那么我们的想法是首先选定一个元素element,通常选定第一个元素。每一轮排序的目的就是将element放在正确的位置上,也就是他的左边都小于他,右边都大于他。让我们来设置前后两个指针,指针left指向数组的第一个数,指针j指向数组的最后一个数。开始时,将element拿出来,这个位置就空下来了。先看指针j指向的数字,如果这个数字小于element就把指针j指向的数字放在空余的位置。指针j所指向的数字拿走了,就相当于把指针j的位置空下来了。这个时候就让指针i来走,找到比element大的数字,放到指针j指向的位置。依次交替行走。如果j所指向的数字是大于element的,就让j--,直到找到比element小的数字。当指针i与j相遇时,查找停止。最后将element放在i与j共同指向的位置上。
总结一下:
1、如果arr[j]>element,j--,否则交换
2、如果arr[i]<element ,i++,否则交换
3、j指针先走,交换后i指针走,j指针停。再交换后,i指针停,j指针走。直到相遇。
4、递归
代码:
let arr = [1, 5, 6, 2, 7, 3, 4, 0];
function quickSort(arr, left, right) {
// 确保数组有元素
if (left < right) {
let element = arr[left],
i = left,
j = right;
while (i < j) {
// 查找到arr[j]>=element的时候j的值
while (i < j && arr[j] >= element) {
j--;
}
// 交换元素,将较小值arr[j]移到前面
if (i < j) {
arr[i++] = arr[j];
}
// 查找到arr[i]<=element的时候i的值
while (i < j && arr[i] <= element) {
i++;
}
// 将较大值arr[i]移到后面
if (i < j) {
arr[j--] = arr[i];
}
}
arr[i] = element;
// 递归再对element的左右进行排序
quickSort(arr, left, i - 1);
quickSort(arr, i + 1, right);
}
}
quickSort(arr, 0, arr.length - 1);
console.log(arr); // (8) [0, 1, 2, 3, 4, 5, 6, 7]