美文网首页
go实现快速排序

go实现快速排序

作者: Simth | 来源:发表于2017-11-03 16:10 被阅读151次

第一,单线程实现快速排序

package main

import (
   "fmt"
  )

func main(){
    array := []int{3, 6, 1, 4, 2, 8}
    fmt.Println(array)
    quickSort(array, 0, len(array)-1)
    fmt.Println(array)
}

func quickSort(array []int, left, right int) {
    if left >= right {
        return
    }
    index := partition(array,left,right)
    quickSort(array, left, index - 1)
    quickSort(array, index + 1, right)
}

func partition(array []int, left, right int) int {
    baseNum := array[left]
    for left < right{
        for (array[right] >= baseNum && right > left){
            right--
        }
        array[left] = array[right]
        for (array[left] <=baseNum && right > left) {
            left++
        }
        array[right] = array[left]
    }
    array[right] = baseNum
    return right
}

第二,多线程实现快速排序

package main
import (
   "fmt"
)
func main() {
    array := []int{3, 1, 4, 1, 5, 9, 2, 6}
    ch := make(chan int)
    go quickSort(array, ch)
    for value := range ch {
        fmt.Println(value)
    }
}
func quickSort(array []int, ch chan int) {
    if len(array) == 1 {
        ch <- array[0]
        close(ch)
        return
    }
    if len(array) == 0 {
        close(ch)
        return
    }
    small := make([]int, 0)
    big := make([]int, 0)
    left := array[0]
    array = array[1:]
    for _, num := range array {
        switch {
        case num <= left :
            small = append(small, num)
        case num > left :
            big = append(big, num)
        }
    }
    left_ch := make(chan int, len(small))
    right_ch := make(chan int, len(big))
    
    go quickSort(small, left_ch)
    go quickSort(big, right_ch)
    
    //合并数据
    for i := range left_ch {
        ch <- i
    }
    ch<-left
    for i := range right_ch {
        ch <- i
    }
    close(ch)
    return
}

相关文章

网友评论

      本文标题:go实现快速排序

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