快速排序算法golang两种实现 【go成功日记】

快速排序

快速排序算法的主要流程是
1、数列中挑出一个元素,称为”基准”,基准可以为序列中任意元素,一般取序列第1个元素
2、重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(相同的数可以到任何一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
3、递归地把拆分的两个子序列进行排序。

package main

import (
    "fmt"
    "math/rand"
    "time"
)

func RandArray(num int) []int {
    arr := make([]int, num)
    //以当前时间为随机数种子
    rand.Seed(time.Now().Unix())

    for i := 0; i < num; i++ {
        arr[i] = rand.Intn(100)

    }
    return arr

}

//来源于WIKI 网站
func quic_wiki(data []int) []int {
    if len(data) <= 1 {
        return data
    }
    mid := data[0]
    head, tail := 0, len(data)-1
    for i := 1; i <= tail; {
        if data[i] > mid {
            data[i], data[tail] = data[tail], data[i]
            tail--
        } else {
            data[i], data[head] = data[head], data[i]
            head++
            i++
        }
    }
    data[head] = mid
    quic_wiki(data[:head])
    quic_wiki(data[head+1:])
    return data

}

func quick_sort(arr []int) []int {

    if len(arr) <= 1 {
        return arr
    }

    median := arr[rand.Intn(len(arr))]
    //fmt.Printf("par: %v\n", median)

    low_part := make([]int, 0, len(arr))
    high_part := make([]int, 0, len(arr))
    middle_part := make([]int, 0, len(arr))

    for _, item := range arr {
        switch {
        case item < median:
            low_part = append(low_part, item)
        case item == median:
            middle_part = append(middle_part, item)
        case item > median:
            high_part = append(high_part, item)
        }
    }

    low_part = quick_sort(low_part)
    high_part = quick_sort(high_part)

    low_part = append(low_part, middle_part...)
    low_part = append(low_part, high_part...)

    return low_part
}
func main() {
    fmt.Println("Quick sort algorithm \n")
    arr := RandArray(13)
    fmt.Println("Initial array is:", arr)
    fmt.Println("")
    fmt.Println(" wiki  Sorted  array is: ", quic_wiki(arr))

    fmt.Println("")
    fmt.Println(" others Sorted array is: ", quick_sort(arr))

}

输出结果:
第一次:

Quick sort algorithm

Initial array is: [53 18 68 0 98 90 26 60 72 66 69 81 79]

wiki Sorted array is: [0 18 26 53 60 66 68 69 72 79 81 90 98]

others Sorted array is: [0 18 26 53 60 66 68 69 72 79 81 90 98]

第二次:

Initial array is: [96 34 36 93 24 55 3 34 11 8 63 7 27]

wiki Sorted array is: [3 7 8 11 24 27 34 34 36 55 63 93 96]

others Sorted array is: [3 7 8 11 24 27 34 34 36 55 63 93 96]

转载请保留原文链接

猜你喜欢

转载自blog.csdn.net/starelegant/article/details/81028703