首页 > 其他分享 >手写快排,解决栈溢出写法,Golang

手写快排,解决栈溢出写法,Golang

时间:2022-08-31 13:23:28浏览次数:46  
标签:arr idx int swapcnt fmt Golang 快排 Println 手写

package main

import "fmt"

var swapcnt int

func main() {
	arr := []int{2, 3, 4, 5, 1}
	//idx := Swap(arr, 0, len(arr))
	//fmt.Println(idx, arr)
	myquickSort(arr, 0, len(arr)-1)
	fmt.Println(arr)
	fmt.Println(swapcnt)
}

func Swap(arr []int, l, r int) int {
	idx := l
	pivot := arr[r]
	for i := l; i <= r; i++ {
		if arr[i] <= pivot {
			if idx != i {
				arr[idx], arr[i] = arr[i], arr[idx]
				swapcnt += 1
			}
			idx += 1
		}
	}
	return idx - 1
}

func myquickSort(nums []int, l, r int) {
	if l < r {
		m := Swap(nums, l, r)
		myquickSort(nums, l, m-1)
		myquickSort(nums, m+1, r)
	}
}

func quickSort(nums []int, l, r int) { //[l,r]
	if l < r {
		m := partition(nums, l, r)
		quickSort(nums, l, m-1)
		quickSort(nums, m+1, r)
	}
}

func partition(nums []int, l int, r int) int {
	key := nums[r]
	i, j := l, l
	for j < r {
		if nums[j] < key {
			nums[i], nums[j] = nums[j], nums[i]
			i++
		}
		j++
	}
	nums[i], nums[r] = nums[r], nums[i]
	return i
}

// 解决栈溢问题
func qsort(arr []int, left, right int) {
	tmp := arr[(left+right)/2]
	i, j := left, right
	for i <= j {
		for arr[i] > tmp {
			i--
		}
		for arr[i] < tmp {
			i++
		}
		if i <= j {
			arr[i], arr[j] = arr[j], arr[i]
			i++
			j--
		}
	}
	if i < right {
		qsort(arr, i, right)
	}
	if j > left {
		qsort(arr, left, j)
	}

}

标签:arr,idx,int,swapcnt,fmt,Golang,快排,Println,手写
From: https://www.cnblogs.com/notomatoes/p/16642753.html

相关文章

  • Golang 中反射的应用与理解
    Golang中反射的应用与理解https://mp.weixin.qq.com/s/TmzV2VTfkE8of2_zuKa0gAGolang中反射的应用与理解原创 赵燕辉 字节跳动技术团队 2022-08-2312:00 发表于......
  • golang for range
    m:=make(map[int]*int)arr:=[]int{1,2,3,4,5}fori,v:=rangearr{m[i]=&v}fork,v:=rangem{fmt.Println(......
  • golang json使用10、-10、0表示,true、false、null
    packagemainimport("encoding/json""errors""fmt")typeAstruct{BrBoolean`json:"br"`}funcmain(){varcAe:=json.Unm......
  • firstgolang
    packagemain//程序的包名/*import"fmt"import"time"*/import("fmt""time")//main函数funcmain(){//函数的{一定是和函数名在同一行的,否则编......
  • 计算四则表达式值 Golang
    思路:先转逆波兰,再求值packagemainimport( "fmt" "strconv" "strings")funcmid2fix(sstring)[]string{ res:=[]string{} exp:=strings.Fields(s) ss......
  • [Golang] cgo 调用 .so 捕获异常问题
    最近需要在go中去调用.so库去完成一些事情,go方面,利用cgo可以顺利的调用.so中的方法,但是有个问题是go没法捕获.so那边出现的异常。如果.so那边异常了,那么会......
  • Golang入门基础1
    Golang入门基本的项目结构go的环境搭建比较简单就直接跳过了工程结构如下每一个go程序都需要依赖一个包现在写一个简单的程序packagemainimport"fmt"funcmain(......
  • golang html转pdf
    url:=""res,err:=http.Get(url)iferr!=nil{fmt.Fprintf(os.Stderr,"fetch:%v",err)os.Exit(1)}//读取资源数据body:[]bytebody,err:=iou......
  • golang 给当前时间增加 或 减少
    times,_:=time.Parse("2006-01-0215:04:05","2014-06-1508:37:18")//给2014年这个值增加30天expireTime:=times.Add(time.Hour*24*30)expireTime:=time.Now().......
  • 从零开始自己动手写自旋锁
    前言我们在写并发程序的时候,一个非常常见的需求就是保证在某一个时刻只有一个线程执行某段代码,像这种代码叫做临界区,而通常保证一个时刻只有一个线程执行临界区的代码的方......