美文网首页算法
算法 - 快排序

算法 - 快排序

作者: 8411e9740257 | 来源:发表于2018-03-06 09:39 被阅读0次
// 分区
// 将比pivot小的左移,比pivot大的右移。
// 返回pivot的位置
//
func partition(data []int, left, right int) int {
    // 交换数据的位置
    store := left
    for j := left; j < right; j++ {
        // pivot为right位置的值
        if data[j] <= data[right] {
            // 交换数据
            if store != j {
                data[store], data[j] = data[j], data[store]
            }
            store++
        }
    }
    // 将基准元素放置到最后的正确位置上
    data[store], data[right] = data[right], data[store]
    return store
}

// 递归调用
//
func quickSort(data []int, left, right int) {
    if left < right {
        idx := partition(data, left, right)
        quickSort(data, left, idx-1)
        quickSort(data, idx+1, right)
    }
}

// 对data进行正向排序
// 1、在数据集之中,选择中间元素作为基准(pivot)。
// 2、所有小于基准的元素,都移到基准的左边;所有大于基准的元素,都移到基准的右边。
// 这个操作称为分区 (partition) 操作,分区操作结束后,基准元素所处的位置就是最终排序后它的位置。
// 3、对基准左边和右边的两个子集,不断重复第1步和第2步,直到所有子集只剩下一个元素为止。
// 难度系数 O(n^2)
// 不稳定排序
//
func QuickSort(data []int) {
    quickSort(data, 0, len(data)-1)
}
  • 测试

func TestQuickSort(t *testing.T) {
    data := []int{0, 2, 4, 6, 8, 10, 9, 7, 5, 3, 1,8}
    fmt.Println("sort before", data)
    sort2.QuickSort(data)
    fmt.Println("sort after", data)
}
  • 分析

sort before [0 2 4 6 8 10 9 7 5 3 1 8]
-----
partition store j left right data data[j] data[right] data[j]<=data[right]
0 0 0 11 [0 2 4 6 8 10 9 7 5 3 1 8] 0 8 true
1 1 0 11 [0 2 4 6 8 10 9 7 5 3 1 8] 2 8 true
2 2 0 11 [0 2 4 6 8 10 9 7 5 3 1 8] 4 8 true
3 3 0 11 [0 2 4 6 8 10 9 7 5 3 1 8] 6 8 true
4 4 0 11 [0 2 4 6 8 10 9 7 5 3 1 8] 8 8 true
5 5 0 11 [0 2 4 6 8 10 9 7 5 3 1 8] 10 8 false
5 6 0 11 [0 2 4 6 8 10 9 7 5 3 1 8] 9 8 false
5 7 0 11 [0 2 4 6 8 10 9 7 5 3 1 8] 7 8 true
6 8 0 11 [0 2 4 6 8 7 9 10 5 3 1 8] 5 8 true
7 9 0 11 [0 2 4 6 8 7 5 10 9 3 1 8] 3 8 true
8 10 0 11 [0 2 4 6 8 7 5 3 9 10 1 8] 1 8 true
9 0 11 [0 2 4 6 8 7 5 3 1 8 9 10]
quickSort left 0 right 11 idx 9 data [0 2 4 6 8 7 5 3 1 8 9 10]
-----
partition store j left right data data[j] data[right] data[j]<=data[right]
0 0 0 8 [0 2 4 6 8 7 5 3 1 8 9 10] 0 1 true
1 1 0 8 [0 2 4 6 8 7 5 3 1 8 9 10] 2 1 false
1 2 0 8 [0 2 4 6 8 7 5 3 1 8 9 10] 4 1 false
1 3 0 8 [0 2 4 6 8 7 5 3 1 8 9 10] 6 1 false
1 4 0 8 [0 2 4 6 8 7 5 3 1 8 9 10] 8 1 false
1 5 0 8 [0 2 4 6 8 7 5 3 1 8 9 10] 7 1 false
1 6 0 8 [0 2 4 6 8 7 5 3 1 8 9 10] 5 1 false
1 7 0 8 [0 2 4 6 8 7 5 3 1 8 9 10] 3 1 false
1 0 8 [0 1 4 6 8 7 5 3 2 8 9 10]
quickSort left 0 right 8 idx 1 data [0 1 4 6 8 7 5 3 2 8 9 10]
-----
partition store j left right data data[j] data[right] data[j]<=data[right]
2 2 2 8 [0 1 4 6 8 7 5 3 2 8 9 10] 4 2 false
2 3 2 8 [0 1 4 6 8 7 5 3 2 8 9 10] 6 2 false
2 4 2 8 [0 1 4 6 8 7 5 3 2 8 9 10] 8 2 false
2 5 2 8 [0 1 4 6 8 7 5 3 2 8 9 10] 7 2 false
2 6 2 8 [0 1 4 6 8 7 5 3 2 8 9 10] 5 2 false
2 7 2 8 [0 1 4 6 8 7 5 3 2 8 9 10] 3 2 false
2 2 8 [0 1 2 6 8 7 5 3 4 8 9 10]
quickSort left 2 right 8 idx 2 data [0 1 2 6 8 7 5 3 4 8 9 10]
-----
partition store j left right data data[j] data[right] data[j]<=data[right]
3 3 3 8 [0 1 2 6 8 7 5 3 4 8 9 10] 6 4 false
3 4 3 8 [0 1 2 6 8 7 5 3 4 8 9 10] 8 4 false
3 5 3 8 [0 1 2 6 8 7 5 3 4 8 9 10] 7 4 false
3 6 3 8 [0 1 2 6 8 7 5 3 4 8 9 10] 5 4 false
3 7 3 8 [0 1 2 6 8 7 5 3 4 8 9 10] 3 4 true
4 3 8 [0 1 2 3 4 7 5 6 8 8 9 10]
quickSort left 3 right 8 idx 4 data [0 1 2 3 4 7 5 6 8 8 9 10]
-----
partition store j left right data data[j] data[right] data[j]<=data[right]
5 5 5 8 [0 1 2 3 4 7 5 6 8 8 9 10] 7 8 true
6 6 5 8 [0 1 2 3 4 7 5 6 8 8 9 10] 5 8 true
7 7 5 8 [0 1 2 3 4 7 5 6 8 8 9 10] 6 8 true
8 5 8 [0 1 2 3 4 7 5 6 8 8 9 10]
quickSort left 5 right 8 idx 8 data [0 1 2 3 4 7 5 6 8 8 9 10]
-----
partition store j left right data data[j] data[right] data[j]<=data[right]
5 5 5 7 [0 1 2 3 4 7 5 6 8 8 9 10] 7

相关文章

  • 基础排序算法总结

    排序算法分为内部排序和外部排序,而我们经常说的基础排序算法,都是内部排序算法。包括冒泡排序,选择排序,插入排序,快...

  • 常用排序算法

    常见排序算法 本文介绍6种常用排序算法,包括冒泡、选择、插入、快排、堆排、希尔排序。下面从排序算法的原理、解题步骤...

  • 数据结构与算法—排序(下)

    在上一篇排序算法中介绍了3中基础排序算法:选择排序,插入排序,希尔排序。接下来介绍的两钟排序算法《归并排序》和《快...

  • 算法-排序算法总结

    排序类型总结 1 排序算法基础实现 2 排序算法应用 2.1 基础排序 2.2 计数排序应用 2.3 快排应用 2...

  • 基本排序算法

    冒泡算法 简单选择排序 堆排序 快排 归并排序

  • 算法与数据结构-排序(3)

    常见排序算法 算法平均时间复杂度原地排序稳定排序插入排序O(n^2) ,有序情况 -> O(n)TrueTrue快...

  • PHP算法系列教程(一)-四大排序算法

    PHP算法系列教程(一)-四大排序算法 冒泡 冒泡排序原理图 选择 选择排序原理图 插入 插入排序原理图 快排 快...

  • Objective-c各种排序算法

    Objective-C排序算法 快排 快速排序是面试中经常会被问的一个排序算法。一般要求手写。快排是对冒泡排序的一...

  • 算法 - 快排序

    源码 代码 测试 分析

  • 各种排序算法

    排序算法包括很多,常见的有快排,堆排序,冒泡排序,归并排序,选择排序,插入排序等, 各种排序算法经常出现在面试题中...

网友评论

    本文标题:算法 - 快排序

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