多线程/多协程快速排序

多线程/多协程快速排序

快速排序

原理略,百度很多

代码实现

package main

import (
	"fmt"
	"sync"
	"time"
)
//分割算法1
func partition1(arr []int, low, high int) int {
	t := arr[low]
	for low < high {
		for low < high && arr[high] > t {
			high--
		}
		arr[low] = arr[high] //将小的往前覆盖,第一个覆盖的是枢纽数据
		for low < high && arr[low] <= t {
			low++
		}
		arr[high] = arr[low] //将大的往后覆盖
	}
	arr[high] = t //将枢纽数据覆盖回去
	return low
}
//分割算法2
func partition2(arr []int, low, high int) int {
	t := arr[low]
	y := low //指向最后一个比t小的数,y++就是第一个比t大的数
	for i := low + 1; i <= high; i++ {
		if arr[i] < t {
			y++
			arr[i], arr[y] = arr[y], arr[i]
		}
	}
	arr[y], arr[low] = arr[low], arr[y]
	fmt.Println(arr, y)
	return y
}
//多协程版本
func SyncQuitSort(arr []int, low, high int) {
	if low >= high {
		return
	}
	mid := partition2(arr, low, high)
	var w sync.WaitGroup
	w.Add(2)
	go func() {
		SyncQuitSort(arr, low, mid-1)
		w.Done()
	}()
	go func() {
		SyncQuitSort(arr, mid+1, high)
		w.Done()
	}()
	w.Wait()
}
//单进程实现版本
func quitSort(arr []int, low, high int) {
	if low >= high {
		return
	}
	mid := partition2(arr, low, high)
	quitSort(arr, low, mid-1)
	quitSort(arr, mid+1, high)
}
func main() {

	arr := []int{10, 7, 54, 2, 35, 76, 0, 41, 121, 3, 4, 3, 3, 21, 11, 1}
	star := time.Now()
	SyncQuitSort(arr, 0, len(arr)-1)
	end := time.Since(star)
	fmt.Printf("Sync st:%v\n", end)
	fmt.Println("sort:", arr)
}


优化建议

这里是一个协程不停的派生出新的协程,这里协程数量没有限制。优化的一个点可以对协程数量限制,当协程数量超过CPU*2个就采用同步的方式。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值