1

由于自己不是计算机专业,数据结构没有太多研究,曾经面试时有被问过关于快速排序以及冒泡排序的写法,冒泡排序比较简单,当时能回答出来,但是快速排序当时就比较懵逼,不知道是个什么方式实现的,面试回来后也没太在意,最近在看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))
}

大佬的代码还是比较厉害的,简单易懂,佩服

以上就是相关的快速排序的实现方法


jiejiewu
13 声望0 粉丝