1.1.1. 一、快速排序法的思路:

快速排序法的示意图如下:

说明:上面的图中,是把数组[2,10,8,22,34,5,12,28,21,11]进行排序。步骤如下:

1、选取任意一个元素(这里选11),比11小的元素放在左边,比11大的放在右边。形成2个数组。

2、对新的2个数组,也执行第1步的操作。选任意一个元素,比这个元素小放在左边,比这个元素大放在右边。

3、当所有的数组都只有一个元素时,排序完成。

快速排序可以用递归实现。

1.1.2. 二、代码实现如下:

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

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

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

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

        // 1 >= r 表明本次分解任务完成
        if l >= r {
            break
        }
        //交换
        temp = array[l]
        array[l] = array[r]
        array[r] = temp
        //优化
        if array[l] == pivot {
            r--
        }
        if array[r] == pivot {
            l++
        }
    }

    // 如果    1== r, 再移动下
    if l == r {
        l++
        r--
    }
    // 向左递归
    if left < r {
        QuickSort(left, r, array)

    }
    // 向右递归
    if right > l {
        QuickSort(l, right, array)
    }
}

说明:是在一个数组内实现排序。没有增加新的数组。注意几点:

1、pivot := array[(left+right)/2] 这个就是随意找一个数。提供比较的元素。

2、从pivot的左边找到大于等于 pivot 的值,从pivot 的右边边找到小于等于 pivot 的值。找到之后把他们的下标交换,给他们交换位置。

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

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

3、向pivot 的左边和右边使用递归。

results matching ""

    No results matching ""