排序算法-快速排序

快速排序算法的核心是在一个数组中,将第一个元素放置在中间位置使这个数组变为左边比这个元素都小,右边比这个组都大的一个数组。

代码实现这个过程如下

// 找出arr[l...r]的分界点j
// 使其分为arr[l,j] arr[j+1,r]两部分
func partition(arr []int, l, r) int {
    // j为当前找到的分界点
    // v为做为分界点的值
    j, v := l, arr[l]
    // i为当前正在考察的元素
    for i := l+1; i <= r; i++ {
        if arr[i] < v {
            arr[j+1], arr[i] = arr[i], arr[j+1]
            j++
        }
    }
    a[j], a[l] = a[l], a[j]
    return j
}

然后快速排序就是递归调用这个方法,将整个数组分为两部分,继续再分为四部分,直到每个数组只有一个元素就完成了排序
代码如下:

// QuickSort 快速排序
func QuickSort(arr []int) {
    quickSort(arr, 0, len(arr)-1)
}

// 对arr的[l,r]快速排序
func quickSort(arr []int, l int, r int) {
    if l >= r {
        return
    }
    p := partition(arr, l, r)
    quickSort(arr, l, p-1)
    quickSort(arr, p+1, r)
}

// 找出arr的[l,r]的标识点
func partition(arr []int, l int, r int) int {
    // arr[l+1:j] < v arr[j+1:i) > v
    // i为正在考察的元素
    v, j := arr[l], l
    for i := l + 1; i <= r; i++ {
        if arr[i] < v {
            arr[j+1], arr[i] = arr[i], arr[j+1]
            j++
        }
    }
    arr[j], arr[l] = arr[l], arr[j]
    return j
}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 快速排序是一种分治排序的算法,将数组划分为两个部分,然后分别对两个部分进行排序。在实际应用中,一个经过仔细调整的快...
    IgorNi阅读 422评论 0 0
  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 5,223评论 0 52
  • 概述:排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    每天刷两次牙阅读 3,747评论 0 15
  • 他手机里 找不到我 一张照片 朋友圈里 没有关于我 一条动态 通讯录里 只有我一串 冰冷的电话号码 他说 他爱我 ...
    半个橙子J阅读 271评论 4 3
  • 后天哥哥就要结婚了,在我还没有缓过神的时候。哥哥是我姨妈的儿子,住的比较远,一年见两三次左右,并没有感觉特别亲切,...
    麻雀之泪阅读 194评论 0 1