数组的快速排序

时间:2022-09-30 01:09:37

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
var arr = [1, 2, 4, 5, 7, 10]

//快速排序
//你有一堆硬币,硬币上的年份不同,你现在要把硬币按年号排好
//第一步:你拿出年份大概是年份区域的二分之一的一个硬币(就是计算机拿出的数组第一个)
//第二步:将其余每个硬币与这个硬币的年份对比,大于这个硬币年份的放右边,小于的放左边
//这样你就得到了两堆硬币,一堆是小于你选硬币年份的,一堆是大于你选硬币年份的
//第三步:将这左右两堆硬币分别当成刚开始的那堆硬币,然后再选出年份大概是年份区域的二分之一的一个硬币
//第四步:(假设我选的是左侧的一堆硬币),然后重复第二步,又得到两堆硬币
//第五步:(再选取左边的一堆硬币),重复第一步,第二 步,第三步
//硬币的数量是有限的,一个硬币只有一个年份,不可能一个硬币分两半,所以当那一堆硬币就是一个硬币时就等于你已经将这堆分完毕
//对人来说这样做很累很烦,但是对电脑来说只要是重复的事就可以运行相同的代码,很快就能解决


function quickSort (arr) {
if (arr.length <= 1) { return arr; }
//如果硬币只有一个或没有,那就不用比了直接就是结果

var pivotIndex = Math.floor(arr.length / 2);
//选取大致为所选年份区域的二分之一的一个硬币
var pivot = arr.splice(pivotIndex, 1)[0];
//你所选出的硬币,不能再算在硬币堆里,要拿出来单独存放
var left = [];
//先定义左边的硬币堆
var right = [];
//先定义右边的硬币堆

for (var i = 0; i < arr.length; i++){
//要比较所有的硬币
if (arr[i] < pivot) {
//比你所选的硬币年份小,放左边一堆
left.push(arr[i]);
} else
{
//比你所选的硬币年份大,放右边一堆
right.push(arr[i]);
}
}
return quickSort(left).concat([pivot], quickSort(right));
//将你所选的硬币放在的一堆硬币的中间
}

console.log(quickSort(arr));
</script>
</head>
<body>
</body>
</html>