由于自己不是计算机专业,数据结构没有太多研究,曾经面试时有被问过关于快速排序以及冒泡排序的写法,冒泡排序比较简单,当时能回答出来,但是快速排序当时就比较懵逼,不知道是个什么方式实现的,面试回来后也没太在意,最近在看C语言的数据结构,拓展下这方面的知识,其中就看到了关于快排算法的描述
描述如下:在待排序的n个记录中任取一个记录(通常取第一个记录),数据序列被此记录划分成两部分。所有关键字比该记录关键字小的记录放置在前一部分,所有比它大的记录放置在后一部分,并把改记录排在这两部分的中间(称为该记录归位),这个过程称作一次快速排序。之后对所有的两部分分别重复上述过程,直至每部分内只有一个记录或空为止。
光看概念有点晕,书上用的是C的源代码,改写下,变成JS代码:
function quickSort(arr, start, end){
var i = start
var j = end
if (start < end ) {
var temp = arr[start]
while (i != j ) {
while(arr[j] > temp && j > i){
j--
}
var com = arr[j]
arr[j] = arr[i]
arr[i] = com
while(arr[i] < temp && i < j){
i++
}
var com1 = arr[j]
arr[j] = arr[i]
arr[i] = com1
}
arr[i] = temp
quickSort(arr, start, i - 1)
quickSort(arr, i + 1, end)
}
}
解释下:
假设一个无序数组:[6,8,7,9,0,1,3,2,4,5]
取第一个元素为参考元素,先从尾端开始即end向左遍历,元素下标为j, 发现比参考元素小的值,则与从左向右遍历的元素arr[i]进行交换,然后就从i开始向右遍历,找到一个比参考元素大的值,而后与arr[j]进行交换,最终i = j 时完成一次快速排序,然后对左边部分进行快排,对右边进行快排。
根据书上就是这样的了,自己也尝试了下,答案是没有问题的
然后看网上某位大佬的做法,更加简单易懂,将快排简单化,就是比参考元素小的放置左边部分,比参考元素大的放置右边部分,而后分别对两部分进行快排。
代码如下:
function quickSort(arr){
if (arr.length <= 1) {
return arr
}
var left = [], right=[]
var pivotIndex = Math.floor(arr.length / 2)
var pivot = arr.splice(pivotIndex, 1)[0]
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))
}
大佬的代码还是比较厉害的,简单易懂,佩服
以上就是相关的快速排序的实现方法
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。