快速排序

2023-04-07 02:16:53 阅读:986 评论:0 点赞:0

一、简介

快速排序使用分治法(Divide and conquer)策略把一个序列分为较小或者较大两个子序列,然后递归排序两个子序列,从到底排序的目的。具体步骤为:
1、从序列中挑选一个元素作为基准(pivot)
2、根据基准元素将序列进行分割,比基准元素大或者小的,放到基准元素前面,反之放到后面(相等的放到那边都可以)。
3、递归子序列,将子序列再次按照相同方法进行排序。

提示

递归时需要判断序列的大小是0或者1(此时序列显然是有序的),此时则停止递归!

二、实例

2.1 Go 实例

package examples

func QuickSort(arr []int, start, end int) {
	// 判断是否需要排序
	if end < start {
		return
	}

	// 确定基准元素
	pivot := arr[end]
	// 用于记录边界位置(到时会把基准元素放到这里)
	pi := start - 1
	// 交换元素位置,将较大或者较小的元素放到基准元素的一侧
	for i := start; i < end; i++ {
		if arr[i] < pivot {
			pi++
			arr[pi], arr[i] = arr[i], arr[pi]
		}
	}
	pi++
	// 把基准元素放到边界上去
	arr[pi], arr[end] = arr[end], arr[pi]

	// 排序子序列(以边界元素)
	QuickSort(arr, start, pi-1)
	QuickSort(arr, pi+1, end)
}

2.2 Python 实例

def quick_sort(arr, start, end):
    # 区间只有一个元素表示结束
    if end < start:
        return

    # 用于记录边界
    pi = start - 1
    # 基准值
    pivot = arr[end]

    # 依次判断小于或者大于基准元素得值
    # 条件成立就交换位置
    # 使大于或者小于的元素都放在基准元素的一侧
    for j in range(start, end):
        print(j, end)
        if arr[j] < pivot:
            pi += 1
            arr[pi], arr[j] = arr[j], arr[pi]

    # 确定下一个区间的边界
    pi += 1
    # 将基准元素放到中间
    arr[pi], arr[end] = arr[end], arr[pi]

    # 再次排序前后分区
    # pi ± 1,表示由基准元素划分的两个分区
    quick_sort(arr, start, pi - 1)
    quick_sort(arr, pi + 1, end)


arr = [10, 8, 2, 3, 7, 4, 9, 0, 1]
quick_sort(arr, 0, len(arr) - 1)
print(arr)

永不言弃

职业:后端开发工程师
学校:重庆师范大学
城市:重庆
文章:169
好吧,不知道说点什么...

登录逐梦笔记

注册逐梦笔记

已有账号?