美文网首页
基础排序:快速排序

基础排序:快速排序

作者: AugustWu | 来源:发表于2017-02-21 15:04 被阅读0次

一、什么是快速排序?

把一个无序的数组,第一趟排序后将数组分隔成两部分,若把前半部分和后半部分的相交元素称为中间元素。前半部分的所有元素小于中间元素,后半部分的所有元素大于中间元素。再对前半部分和后半部分分别进行上述递归操作。最终得到一个有序数组。

二、如何进行快速排序?

最近正好我在学习Go语言,决定用Go语言自己描述一遍。

func QuickSort(arr []int) {
    if len(arr) <= 1 {
        return
    }

    mid, i := arr[0], 1
    left, right := 0, len(arr)-1

    for left < right {
        if arr[i] > mid {
            arr[i], arr[right] = arr[right], arr[i]
            right--
            // 稍微解释一下这里为何不需要 i++
            // 因为 arr[right] 和 arr[i] 交换后
            // arr[i] 即原来 arr[right] 的值不一定 > mid
            // 故下一轮要继续比较
        } else {
            arr[i], arr[left] = arr[left], arr[i]
            left++
            i++
            // 这里有 i++ 的原因是
            // left 的值必然 <= mid 
            // 交换后只需继续判断 arr[++i]
        }
    }

    arr[left] = mid
    QuickSort(arr[:left])
    QuickSort(arr[left+1:])
}

但是,上面的代码会存在交换次数过多的问题,这个问题可以使用下面代码进行优化。

func QuickSort(arr []int) {
    if len(arr) <= 1 {
        return
    }

    mid := arr[0]
    left, right := 0, len(arr)-1

    for left < right {
        if left < right && arr[right] >= mid  {
            right--
        }

        arr[left++] = arr[right]

        if left < right &&  arr[left] <= mid {
            left++
        }

        arr[right--] = arr[left]
    }

    arr[left] = mid
    QuickSort(arr[:left])
    QuickSort(arr[left+1:])
}

(如有错误,欢迎指正)

相关文章

  • 开发者应该掌握的几种排序算法

    该篇文章主要介绍了算法基础以及几种常见的排序算法:选择排序、插入排序、冒泡排序、快速排序、堆排序。 一、算法基础 ...

  • Java常见排序基础 - 中

    在Java常见排序基础 - 上中主要介绍了冒泡排序、选择排序、插入排序三种基础排序,本篇文章主要介绍的是 快速排序...

  • 排序算法

    概述 一般排序算法(以元素比较为基础) => 快速排序、归并排序、插入排序、冒泡排序、堆排序 特殊排序算法 => ...

  • 简单排序

    排序是基础的算法问题,常见的排序有插入排序、冒泡排序、快速排序等,它们分别有不同的计算复杂度。插入排序和冒泡排序的...

  • 基础排序:快速排序

    一、什么是快速排序? 把一个无序的数组,第一趟排序后将数组分隔成两部分,若把前半部分和后半部分的相交元素称为中间元...

  • 面试准备--排序

    堆排序 快速排序(simple) 快速排序(regular) 归并排序 Shell排序 插入排序 选择排序 冒泡排序

  • ios各种排序算法

    最近把面试需要准备的基础算法总结一下,包括冒泡排序,选择排序,快速排序,插入排序。 冒泡排序(从小到大排):始终从...

  • 排序

    插入排序 选择排序 冒泡排序 归并排序 快速排序* 三路快速排序

  • 算法汇总

    关于算法: 基础技巧:分治、二分、贪心排序算法:快速排序、归并排序、计数排序搜索算法:回溯、递归、深度优先遍历,广...

  • 算法与数据结构简介

    0x01 算法 基础技巧:分治、二分、贪心 排序算法:快速排序、归并排序、计数排序 搜索算法:回溯、递归、深度优先...

网友评论

      本文标题:基础排序:快速排序

      本文链接:https://www.haomeiwen.com/subject/zzluwttx.html