golang数据结构之快速排序

具体过程:黑色标记代表左指针,红色标记代表右指针,蓝色标记代表中间值。(依次从左往向下)

//QuickSort 快速排序
func QuickSort(left int, right int, arr *[7]int) {
    l := left
    r := right
    pivot := arr[(left+right)/2]
    tmp := 0
    for l < r {
        for arr[l] < pivot {
            l++
        }
        for arr[r] > pivot {
            r--
        }
        if l >= r {
            break
        }
        tmp = arr[l]
        arr[l] = arr[r]
        arr[r] = tmp
        if arr[l] == pivot {
            r--
        }
        if arr[r] == pivot {
            l++
        }
    }
    if l == r {
        l++
        r--
    }
    if left < r {
        QuickSort(left, r, arr)
    }
    if right > l {
        QuickSort(l, right, arr)
    }
}

原文地址:https://www.cnblogs.com/xiximayou/p/12017445.html

时间: 2024-10-12 02:42:02

golang数据结构之快速排序的相关文章

浅谈算法和数据结构: 四 快速排序

原文:浅谈算法和数据结构: 四 快速排序 上篇文章介绍了时间复杂度为O(nlgn)的合并排序,本篇文章介绍时间复杂度同样为O(nlgn)但是排序速度比合并排序更快的快速排序(Quick Sort). 快速排序是20世纪科技领域的十大算法之一 ,他由C. A. R. Hoare于1960年提出的一种划分交换排序. 快速排序也是一种采用分治法解决问题的一个典型应用.在很多编程语言中,对数组,列表进行的非稳定排序在内部实现中都使用的是快速排序.而且快速排序在面试中经常会遇到. 本文首先介绍快速排序的思

[golang] 数据结构-快速排序

快速排序是个非常经典.高效.常用的排序算法.很多语言标准库里的排序算法都有用到它. 原理快排原理其实比较简单,就是将原本很大的数组拆成小数组去解决问题.要拆就得找个拆的位置.如果吧这个位置称为支点,那么快速排序问题就变成了不断的去找到拆分的支点元素位置.通常找支点就是以某个元素为标准,分别从最右侧元素向左找到比指定元素小的位置,再从最左侧开始向右找比指定元素大的位置.如果两个位置不相同就交换两个位置,在继续分表从两头相向寻找.找到合适的位置就是我们需要的支点.支点两边的元素再各自重复上面的操作,

数据结构之快速排序

快速排序是冒泡排序的改进版,也是最好的一种内排序,在很多面试题中都会出现,也是作为程序员必须掌握的一种排序方法. 思想:1.在待排序的元素任取一个元素作为基准(通常选第一个元素,但最的选择方法是从待排序元素中随机选取一个作为基准),称为基准元素: 2.将待排序的元素进行分区,比基准元素大的元素放在它的右边,比其小的放在它的左边: 3.对左右两个分区重复以上步骤直到所有元素都是有序的. 所以我是把快速排序联想成东拆西补或西拆东补,一边拆一边补,直到所有元素达到有序状态. 下面再看看示图理解下吧:

c语言数据结构之 快速排序

编译器:VS2013 #include "stdafx.h"#include<stdlib.h> //函数声明 void QuickSort(int a[],int n); //快速排序(从小到大)void QSort(int a[], int m, int n); //快速排序的递归调用int Pratition(int a[], int m, int n); //快速单次排序 int main(){ int i,n,a[100]; printf("请输入需要排

使用Golang实现的快速排序

一.舞动的快速排序 在实现排序算法前,先让我们来欣赏一段关于快速排序的视频,本段视频展示了快速排序的原理,如果没有看懂,请看完本文后再回头来看一下,应该就明白了吧. O(∩_∩)O~ 二.快速排序实现 2.1 快速排序基础版 通过下面一组数据,将最左边的数设定为轴,并记录其值为 s. (注意:*表示要交换的数,[]表示轴) [41] 24 76* 11 45 64 21 69 19 36* [41] 24 36 11 45* 64 21 69 19* 76 [41] 24 36 11 19 64

数据结构_快速排序

//快速排序 class ArrayList { constructor () { this.array = [] } insert (data) { return this.array.push(data) } quickSort () { this.array = this.quick(this.array) } //辅助函数 quick (arr) { let length = arr.length if (length <= 1) return arr let pivotValue =

[golang] 数据结构-简单选择排序

原理简单选择排序应该是最直观最容易理解的排序方法了.直接从头开始一个一个去比,找出最小的放到最左边.再依次完成其他位的排序. 时间复杂度比较次数固定为O(n^2),数据交换次数是0~n-1次因为会交换不同位置相同数值的数据,所以选择排序并不稳定 代码实现 package main import ( "fmt" ) func main() { var length = 10 var mm = make(map[int]int, length) var o []int // 先准备一个顺序

[golang] 数据结构-树形选择排序(锦标赛排序)

接上文 简单选择排序简单选择排序很容易理解,代码也很容易实现.但毕竟比较次数太多.树形选择排序则对这个问题进行了改进. 原理简单来说,树形选择排序(Tree selection sort)就是在选择完一轮找出最小值后,直接在与最小值比较中稍大的元素里筛选出最小的.这样避免了简单选择查询那种,抛弃了之前比较过的结果,每次都全部重新比较的情况. 流程举例 先列出所有待排序的元素如:8.4.12.7.35.9.22,并用他们组成满二叉树的叶子元素,不足的位置以∞作为补充.将元素两两相比较,分别得到较小

[golang] 数据结构-堆排序

接上文 树形选择排序上篇也说了,树形选择排序相较简单选择排序,虽然减少了时间复杂度,但是使用了较多空间去储存每轮比较的结果,并且每次还要再和胜出节点比较.而堆排序就是为了优化这个问题而在1964年被两位大佬发明. 原理首先有几个关于树的定义: 如果一棵树每个节点的值都大于(小于)或等于其字节点的话,那么这棵树就是大(小)根树如果一棵大(小)根树正好又是完全二叉树,则被称为大根堆(小根堆) 堆排序就是利用大根堆(小根堆)的特性进行排序的.从小到大排序一般用大根堆,从大到小一般用小根堆. 流程 先把