快速排序

package main

import (
	"fmt"
)

func qsort(arr []int, left int, right int) {
	if left < right {
		middle := find_middle(arr, left, right)

		qsort(arr, left, middle-1)
		qsort(arr, middle+1, right)
	}
}

//寻找中元 注意是left <= right(而不是left<right) 因为如果有等于中元的key的元素,会死循环
func find_middle(arr []int, left int, right int) int {
	key := arr[left]
	for left < right {

		for arr[right] > key && left <= right {
			right--
		}
		if left < right {
			arr[left], arr[right] = arr[right], arr[left] //用golang写算法最爽的就是这个
			left++

		}

		for arr[left] < key && left <= right {
			left++
		}
		if left < right {
			arr[left], arr[right] = arr[right], arr[left]
			right--

		}
	}

	arr[left] = key
	return left
}

func show_arr(arr []int) {
	len1 := len(arr)
	for i := 0; i < len1; i++ {
		fmt.Printf("%d ", arr[i])
	}
	fmt.Printf("\n")
}

func main() {
	var arr = []int{10, 5, 6, 19, 35, 24, 17, 5}
	show_arr(arr)
	qsort(arr, 0, len(arr)-1)
	show_arr(arr)
}


你可能感兴趣的:(快速排序)