快速排序

快速排序(Quick Sort)

快速排序原理示意图

快速排序(Quick Sort)使用得最广泛,速度也较快,是图灵奖得主C.A.R.Hoare(1934-) 于1960事提出的

算法简介

快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序

算法描述和实现

快速排序使用分治法来吧一个串(list)分成两个子串(sub-lists)。具体算法描述如下:

  • 从数列中挑出一个元素,称为”基准“(pivot)
  • 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准值的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为(partition)操作
  • 递归的(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序

js代码实现

方法1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function quickSort(arr, left, right) {
if (Array.isArray(arr) && typeof left === 'number' && typeof right === 'number') {
if (left < right) {
var x = arr[right],
i = left - 1,
temp
for(var j = left ; j <= right ; j++){
if(arr[j] <= x){
i++
temp = arr[i]
arr[i] = arr[j]
arr[j] = temp
}
}
quickSort(arr, left, i - 1);
quickSort(arr, i + 1, right);
}
return arr
}
}

const arr = [2, 1, 3, 5, 4]
console.log(quickSort(arr, 0, arr.length - 1))

方法2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function quickSort2(arr){
if(arr.length <=1){
return arr
}
const middleIndex = Math.floor(arr.length/2) // 取基准点
const valueArr = arr.splice(middleIndex,1) // 取基准点的值,splice(index,1) 则返回的是含有被删除的元素的数组
const middleVal = valueArr[0]
const left = []
const right = []
for(let i = 0 ; i < arr.length;i++){
if(arr[i]<middleVal){
left.push(arr[i])
}else{
right.push(arr[i])
}
}

return quickSort2(left).concat(valueArr,quickSort2(right))
}

const arr = [2, 1, 3, 5, 4]
console.log('quickSort2',quickSort2(arr))