Go-快速排序

package main

import "fmt"

// 快速排序
// 特征:
// 		1. 选定一个数,让这个数左边的比这个数小,右边比这个数大
//		2. 然后这个基数就是已经排好序的,将左边部分和右边部分执行1操作
//		3. 递归
// 实现:
//		1. 难点:
//			a. 参考数怎么找?
//			b. 如何让这个数左边的数比这个数小,右边的数比这个数大(最难的部分) => 填坑大法
//			c. 递归的退出条件


// QuickSort 快速排序
func QuickSort(nums []int, left, right int) {
	// 1. refer 参考数,一般等于元组中第一个元素
	refer := nums[left]
	loopFlag := true
	// 2. 让这个数左边的比这个数小,右边比这个数大
	for loopFlag {
		// 1. 先在右边找比查考数小的数,找到则赋值给左边
		for {
			if left == right {
				// 如果两者相等,意味着目标达成,这个位置的数就是已经拍好序的
				nums[left] = refer
				loopFlag = false
				break
			}
			if nums[right] >= refer {
				right --
			}  else {
				// 3. 在右边找到则将值赋值给
				nums[left] = nums[right]
				break
			}
		}

		// 2. 先在左边找比参考数大的数,赋值给右边
		for {
			// 如果两者相等,意味着目标达成,这个位置的数就是已经排好序的
			if left == right {
				nums[left] = refer
				loopFlag = false
				break
			}
			
			if nums[left] <= refer {
				left ++
			} else {
				// 3. 在右边找到则将值赋值给
				nums[right] = nums[left]
				break
			}
		}
	}
	//fmt.Println(left, right)
	// 左边部分
	leftPart := nums[:left]
	//  右边部分
	rightPart := nums[right+1:]
	//fmt.Println("left:", leftPart)
	//fmt.Println("Right:", rightPart)
	// 左边不为空则排序
	if len(leftPart) != 0 {
		QuickSort(leftPart, 0, len(leftPart)-1)
	}
	//  右边不为空则排序,也是递归的退出条件
	if len(rightPart) != 0 {
		QuickSort(rightPart, 0, len(rightPart)-1)
	}

}

func main() {
	//nums := []int{64, 5, 2, 44, 22, 45, 22, 666 , 22, 77, 3, 64, 74, 74, 73, 22, 43, 23,56, 77, 777}
	//nums := []int{56, 5, 2, 44, 22, 45, 22, 23, 22, 43, 3, 64, 22}
	//nums := []int{56, 5, 2, 44, 45, 22, 23, 43, 3, 64}
	//nums := []int{3, 5, 2, 44, 45, 22, 23, 43}
	nums := []int{64}
	//nums := []int{64, 33}
	//nums := []int{64, 33, 55}
	QuickSort(nums, 0, len(nums)-1)
	fmt.Println(nums)
}

  

posted @ 2021-02-23 12:24  梦_鱼  阅读(183)  评论(0编辑  收藏  举报