Golang Programming QuickSort(快速排序)

in cn •  6 years ago 

快速排序(Quick Sort)

快速排序(QuickSort)是对冒泡排序的一种改进;

  • 基本思想是:

    • 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,

    • 然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据编程有序序列。

快速排序法应用实例:

  • 要求: 对[-9,78,0,23,-567,70]进行从小到大的排序,要求使用快速排序法。

  • 说明:

    • 如果取消左右递归,结果是 -9 -567 0 23 78 70
    • 如果取消右递归,结果是 -567 -9 0 23 78 70
    • 如果取消左递归,结果是 -9 -567 0 23 70 78
  • 代码实现:

package main

import "fmt"

//QucckSort,快速排序函数
//说明:
//1.left 表示数组左边的下标;
//2.right 表示数组右边的下标;
//3.array表示要排序的数组;
func QuickSort(left int, right int, array *[9]int) {
    l := left
    r := right
    // pivot 是中轴,支点
    pivot := array[(left+right)/2]
    temp := 0

    //for循环的目标是:
    //将比pivot小的数放到左边,
    //将比pivot大的数放到右边;
    for l < r {

        //从 pivot的左边找到大于等于pivot的值;
        for array[l] < pivot {
            l++
        }
        //从 pivot的右边找到小于等于pivot的值;
        for array[r] > pivot {
            r--
        }

        // l >= r 表明本次分解任务完成,break
        if l >= r {
            break
        }

        //交换:
        temp = array[l]
        array[l] = array[r]
        array[r] = temp

        //优化
        if array[l] == pivot {
            r--
        }
        if array[r] == pivot {
            l++
        }
    }

    // 如果 l == r,再移动一下; 如果没有本判断,程序会卡在r==l的情况下;
    if l == r {
        l++
        r--
    }

    //向左递归
    if left < r {
        QuickSort(left, r, array)
    }
    //向右递归
    if right > l {
        QuickSort(l, right, array)
    }
}
func main() {
    arr := [9]int{-9, 78, 0, 23, -567, 70, 123, 99, -80}
    fmt.Println("main...", arr)
    QuickSort(0, len(arr)-1, &arr)
    fmt.Println("main...", arr)
}
Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!