ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-08-31 13:33:14  阅读:243  来源: 互联网

标签: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,手写
来源: https://www.cnblogs.com/notomatoes/p/16642753.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有