首页 > 其他分享 >快速排序

快速排序

时间:2022-12-21 17:34:38浏览次数:26  
标签:arr right int func 排序 快速 left

快速排序

时间复杂度:O(logn)

算法步骤:

  • 将数据根据一个值按照大小分为左右两边,左面小于此值,右面大于此值

  • 将两边数据调用步骤1

  • 将所有数据合并

优化:

标准的快速排序每次都取:数据的第一个元素作为基准来分左右两边。如果数据已经排好序了,那么快速排序的时间复杂度会上升到 O(n^2),所以会采用随机数来作为基准。

写法1:该写法消耗的空间较大

func QuickSort(arr []int) []int {
    if len(arr) <= 1 {
        return arr
    }
    splitdata := arr[0]          //第一个数据
    low := make([]int, 0)        //比我小的数据
    hight := make([]int, 0)      //比我大的数据
    mid := make([]int, 0)        //与我一样大的数据
    mid = append(mid, splitdata) //加入一个
    for i := 1; i < len(arr); i++ {
        if arr[i] < splitdata {
            low = append(low, arr[i])
        } else if arr[i] > splitdata {
            hight = append(hight, arr[i])
        } else {
            mid = append(mid, arr[i])
        }
    }
    low, hight = QuickSort(low), QuickSort(hight)
    myarr := append(append(low, mid...), hight...)
    return myarr
}

写法2:该写法消耗的空间较小

func QuickSort3(arr []int) {
    _quickSort(arr, 0, len(arr)-1)
}

func _quickSort(arr []int, left int, right int) {
    if left < right {
        // 位置划分
        middleIndex := partition(arr, left, right)
        // 左面排序
        _quickSort(arr, left, middleIndex-1)
        // 右面排序
        _quickSort(arr, middleIndex+1, right)
    }
}

// 标准分割函数(分区)
func partition(arr []int, left int, right int) int {
    pivot := arr[left] // 导致 left 位置为空
    for left < right {
        // right 指针值 >= pivot,right 指针左移
        for left < right && arr[right] >= pivot {
            right--
        }
        // 填补 left 位置的值, arr[left] 是一个空位置
        arr[left] = arr[right]

        // left 指针值 <= pivot left 指针右移
        for left < right && arr[left] <= pivot {
            left++
        }
        // 填补 right 位置的值, arr[right] 是一个空位置
        arr[right] = arr[left]
    }
    // left = right
    arr[left] = pivot
    return left
}

写法3:使用 sort

package sort

import (
    "sort"
)

func quickSort1(arr []int) {
    sort.Slice(arr, func(i, j int) bool {
        return arr[i] < arr[j]
    }
}

// -------------------------------------------------------

type myInts []int

func (m myInts) Less(i, j int) bool { return m[i] < m[j] }

func (m myInts) Len() int { return len([]int(m)) }

func (m myInts) Swap(i, j int) { m[i], m[j] = m[j], m[i] }

func quickSort2(arr []int) []int {
    sort.Sort(myInts(arr))
    return arr
}

// [1,2,3,4,5,6,7]

标签:arr,right,int,func,排序,快速,left
From: https://www.cnblogs.com/geraldkohn/p/16996659.html

相关文章

  • 【数据结构-排序】内部排序
    目录1直接插入排序1.1算法简要思想1.2算法特性2希尔排序2.1算法简要思想2.2手动模拟2.3算法特性3冒泡排序3.1算法简要思想3.2算法特性4快速排序4.1算法思路4.2......
  • mysql分组后限制条数和排序
    废话少数直接上需求和解决方案需求:分组查询指定条数 这是我的表表名news,查询class_id为1和2的数据各三条这是sql:selectn1.*fromnewsn1wheren1.`class_id`in......
  • 四大排序
    ***以下排序皆以升序为例***插入排序1.1直接插入排序1.1.1单趟排序思想(三种情况)对于第一张图片中的数据,我们设置一个tmp保存最后一个数据,设置end表示5的下标。在这串数据......
  • QT 开发快速入门
    本人qt业余,但有的时候要用到qt,而又没有系统的学习,用到哪里看哪里。环境:vs2012+qt-vsaddins+qt5.5  qt的按钮点击事件出发的基本要素:1.按钮触发函数为public......
  • Vue-router4.0接口快速识别
    Vue-router4.0接口快速识别<router-link> :将会被渲染a标签属性名属性类型属性作用tostring/object相当于跳转调用router.push(string/object)replacebo......
  • HeapSort堆排序原理与实现
    HeapSort堆排序原理与实现  堆排序是比较重要的数据结构,其主要优点是通过排序二叉树的特性能够记录每个数之间的大小关系,以至于不需要重复比较,对于海量数据排序问题可以减......
  • jQuery 3.6.3 发布,快速选择器修复
    jQuery3.6.2 刚于上周发布,该版本包含了几个变化,其中最重要的是解决了在大多数浏览器中引入的一些新选择器的问题,如:has()。现如今,jQuery3.6.3也已发布;原因在于有一个......
  • SaaS产品的发展阶段:MVP阶段,PMF阶段,快速成长期,成熟期
    一款SaaS产品的发展和其它移动互联网产品一样,也有自己不同的发展阶段,分别为:1.MVP阶段;2.PMF阶段;3.快速成长期;4.成熟期。每个阶段,产品要完成的指标、任务都各有侧重,分......
  • 拓扑排序
    拓扑排序TODO待补全Codeimportjava.io.*;importjava.util.LinkedList;importjava.util.List;importjava.util.Stack;publicclassMain{staticStreamT......
  • [vue] 列表排序
    <divid="root"><h2>人员列表</h2><inputtype="text"placeholder="请输入名字"v-model="keyWord"><button@click="sortType=2">年龄升序</button><button@cl......