【算法】快速排序(typescript)2

简介: 快速排序(typescript)2

前言


上次使用的是双边循环法,这次补充一下单边循环法。

双边循环法从数组的两边交替遍历元素,虽然更加直观,但是代码实现相对繁琐。而单边循环法则简单得多,值从数组的一边进行遍历和交换。直接上代码


正文



函数签名不变:


function quick_sort(input: number[], start: number, end: number) {
        if (start >= end) {
            return
        }
        let pivotIndex = partition(input, start, end)
        quick_sort(input, start, pivotIndex - 1)
        quick_sort(input, pivotIndex + 1, end)
    }


不同的是 partition 函数


function partition(input: number[], start: number, end: number): number {
        let pivot = input[start] // 1.
        let mark = start // 2.
        for (let i = start + 1; i <= end; i++) { // 3. A.
            if (input[i] < pivot) {// 4. 每次是正在移动的元素(input[i]),与基准元素比较的值(pivot)
                mark++ // 5.
                [input[i], input[mark]] = [input[mark], input[i]] // 6.
            }
        }
        input[start] = input[mark] // 7.
        input[mark] = pivot
        return mark
    }


  1. 设定基准元素时最左边的元素
  2. 设定最后要与基准元素交换的元素的下标是最左边元素的下边
  3. 这里只列出说明:因为选的是最左边元素,比较的话也是和基准元素自身比较,所以此处是start + 1,第一次比较就不需要了
  4. 这里要划重点:每次是正在移动的元素(input[i]) -> i,与基准元素比较的值(pivot)-> pivot,切记这里的下标和比较对象很容易出错
  5. 当当前元素的值比基准元素小的时候,最后要与基准元素交换的元素下标右移
  6. 当当前元素的值比基准元素小的时候,最后要与基准元素交换的元素的值与当前元素交换
  7. 最后要与基准元素交换的元素与基准元素交换值
    A.这里强调一下:“=start+1”是起点,“<=end”是重点,注意边界。A.[2021-08-19 补充~]
    继续核对结果


let input = [2, 4, 2, 4, 4, 32, 5, 3, 5, 53, 5, 53, 3, 5, 5, 53,]
    console.log("start -> ", input.toString())
    quick_sort(input, 0, input.length - 1)
    console.log("end -> ", input.toString())

3.webp.jpg

核对结果

目录
相关文章
|
19天前
|
搜索推荐 C语言
【排序算法】快速排序升级版--三路快排详解 + 实现(c语言)
本文介绍了快速排序的升级版——三路快排。传统快速排序在处理大量相同元素时效率较低,而三路快排通过将数组分为三部分(小于、等于、大于基准值)来优化这一问题。文章详细讲解了三路快排的实现步骤,并提供了完整的代码示例。
45 4
|
2月前
|
算法 搜索推荐 Shell
数据结构与算法学习十二:希尔排序、快速排序(递归、好理解)、归并排序(递归、难理解)
这篇文章介绍了希尔排序、快速排序和归并排序三种排序算法的基本概念、实现思路、代码实现及其测试结果。
24 1
|
2月前
|
搜索推荐 Java Go
深入了解快速排序算法
深入了解快速排序算法
39 2
|
2月前
|
存储 搜索推荐 算法
【排序算法(二)】——冒泡排序、快速排序和归并排序—>深层解析
【排序算法(二)】——冒泡排序、快速排序和归并排序—>深层解析
|
2月前
|
算法 Python
Python算法编程:冒泡排序、选择排序、快速排序
Python算法编程:冒泡排序、选择排序、快速排序
|
2月前
|
搜索推荐 C语言 C++
【C语言】指针篇-精通库中的快速排序算法:巧妙掌握技巧(4/5)
【C语言】指针篇-精通库中的快速排序算法:巧妙掌握技巧(4/5)
|
4月前
|
搜索推荐 算法 Java
现有一个接口DataOperation定义了排序方法sort(int[])和查找方法search(int[],int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法
该博客文章通过UML类图和Java源码示例,展示了如何使用适配器模式将QuickSort类和BinarySearch类的排序和查找功能适配到DataOperation接口中,实现算法的解耦和复用。
44 1
现有一个接口DataOperation定义了排序方法sort(int[])和查找方法search(int[],int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法
|
4月前
|
算法 搜索推荐
算法设计 (分治法应用实验报告)基于分治法的合并排序、快速排序、最近对问题
这篇文章是关于分治法应用的实验报告,详细介绍了如何利用分治法实现合并排序和快速排序算法,并探讨了使用分治法解决二维平面上的最近对问题的方法,包括伪代码、源代码实现及时间效率分析,并附有运行结果和小结。
|
5月前
|
算法 搜索推荐 编译器
算法高手养成记:Python快速排序的深度优化与实战案例分析
【7月更文挑战第11天】快速排序是编程基础,以O(n log n)时间复杂度和原址排序著称。其核心是“分而治之”,通过选择基准元素分割数组并递归排序两部分。优化包括:选择中位数作基准、尾递归优化、小数组用简单排序。以下是一个考虑优化的Python实现片段,展示了随机基准选择。通过实践和优化,能提升算法技能。**
57 3
|
5月前
|
算法 搜索推荐 C#