前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >go例子(四) 使用 goroutinue 进行排序

go例子(四) 使用 goroutinue 进行排序

作者头像
杜争斌
发布2022-04-27 19:24:37
4470
发布2022-04-27 19:24:37
举报
文章被收录于专栏:我的博文

受使用 goroutinue 进行素数判断(主 goroutinue 进行循环添加数字到新创建的判断素数的 goroutinue 中,参考《golang 真正的高并发用法 查找素数》 )的启发,实现一个使用 goroutinue 进行 slice 排序

版本一:

思路:

  1. 启动 len(data) -2 个协程,每个协程对比指定下标(从1到len(data) - 2 个)的值与前一个和后一个的进行判断,符合条件进行交换

  2. 一次只能有一个 goroutinue 进行交换

  3. 类似于 老师组织一次 排序游戏,每一次只能有一个同学进行交换。不需要判断,到一定时间久进化到排序状态了。

代码语言:javascript
复制
package main
import (
    "fmt"    
    "math/rand"
//    "sync"
    "time"
)
var size = 7
var data = []int{}
//var want_change = make(chan bool,1)
var can_change = make(chan bool,1)
//var wg = sync.WaitGroup{}
func main(){
    for i := 0; i < size; i++ {
        data = append(data,rand.Intn(100))
    }
    fmt.Println(data)
    //wg.Add(size)
    can_change <- true
    for i := 1; i < size - 1; i++ {
        go change(i)    
    }
    //go printdata()    
    printdata()
    //wg.Wait()
}
func printdata(){
    exit := false
    for !exit {
        fmt.Println(data)
        exit = true
        for i := 0;i < size-1; i++ {
            if data[i] > data[i+1] {
                exit = false            
            }        
        }
        time.Sleep(time.Second)    
    }
}
func change(i int) {
    for {
        select {
            case c,ok := <- can_change: {
                if !ok {
                    can_change <- true
                    continue
                }
                if c != true {
                    can_change <- true
                    continue
                }
                if data[i -1] > data [i] {
                    data[i - 1],data[i] = data[i],data[i - 1]
                    fmt.Printf("swap data[%d]:%d data[%d]%d\n",i-1,data[i-1],i,data[i])    
                    fmt.Println("swap:",data)                    
                }
                if data[i] > data[i+1]{
                    data[i],data[i + 1] = data[i + 1],data[i]
                    fmt.Printf("swap data[%d]:%d data[%d]%d\n",i,data[i],i+1,data[i+1])
                    fmt.Println("swap:",data)
                }    
                can_change <- true                            
            }        
        }
    }
}

版本二:

思路:

  1. 启动 len(data) -2 个协程,每个协程对比指定下标(从1到len(data) - 2 个)的值与前一个和后一个的进行判断,符合条件进行交换

  2. 一次只能有一个 goroutinue 进行交换

  3. 类似于 老师组织一次 排序游戏,每一次只能有一个同学进行交换,当大家都认为不需要再交换时就完成了排序。

代码语言:javascript
复制
package main

import (
    "fmt"
    "math/rand"
    "sync"
)
var size = 7
var data = []int{}
var canChangeChannel = make(chan bool,1)
var wg = sync.WaitGroup{}
func main(){
    for i := 0; i < size; i++ {
        data = append(data,rand.Intn(100))
    }
    fmt.Println(data)
    wg.Add(size-2)
    canChangeChannel <- true
    for i := 1; i < size - 1; i++ {
        go change(i)    
    }
    wg.Wait()
    fmt.Println(data)
}
func change(i int) {
    exit := false
    for !exit {
        select {
            case c,ok := <- canChangeChannel: {
                if !ok {
                    canChangeChannel <- true
                    continue
                }
                if c != true {
                    canChangeChannel <- true
                    continue
                }
                exit = true
                for i := 0;i < size-1; i++ {
                    if data[i] > data[i+1] {
                        exit = false
                    }
                }
                if data[i -1] > data [i] {
                    data[i - 1],data[i] = data[i],data[i - 1]
                    fmt.Printf("swap data[%d]:%d data[%d]%d\n",i-1,data[i-1],i,data[i])    
                    fmt.Println("swap:",data)                    
                }
                if data[i] > data[i+1]{
                    data[i],data[i + 1] = data[i + 1],data[i]
                    fmt.Printf("swap data[%d]:%d data[%d]%d\n",i,data[i],i+1,data[i+1])
                    fmt.Println("swap:",data)
                }
                canChangeChannel <- true
            }        
        }
    }
    wg.Done()
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-07-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档