ICode9

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

排序

2021-05-20 17:05:16  阅读:120  来源: 互联网

标签:right end start pivot 排序 left


快排(QuickSort)

快排是经典的二分法思想的排序方法, 它是不稳定的(即a0, a1的值均为1, 但是排序后可能a1在a0前面, 不保证相对顺序不变).

输入: 数组A, 长度为L. 
输出: 排序后的数组A.
基本思想: 
	①select pivot: 从输入数组中随机取一个数字作为基准(pivot);
	②partition: 将所有<pivot的数字放到pivot左边, 记为子数组A_left, 
	所有>pivot的数字放到pivot右边, 记为A_right;
	③recursion: 对子数组A_left和A_right递归的调用步骤①和步骤②.
  经典的方法和荷兰国旗法的区别在于②, 经典方法是返回一个position,
所有position左边的数字都<=pivot, position右边的数字都>pivot, 
position本身的值==pivot; 而荷兰国旗法返回的是一个开区间(left, right),  
left左边包括自身的值都<pivot, right右边包括自身的值都>pivot, 
而区间内的值都==pivot. 效率更高.

代码实现(python, 荷兰国旗法)

def swap(A, i, j):
	tmp = A[i]
	A[i] = A[j]
	A[j] = tmp

def partition(A, start, end):
    left = start - 1
    right = end
    pivot = A[end-1]
    k = start
    while k < right:
        if A[k] == pivot:
            k += 1
        elif A[k] < pivot:		# 将碰到的<pivot的值放到left控制的左半部分
            left += 1
            swap(A, k, left)
            k += 1
        else:					# 将碰到的>pivot的值放到right控制的右半部分
            right -= 1
            swap(A, k, right) 
    return left, right
    
def QSort(A, start, end):
	if start < end:
		left, right = partition(A, start, end) 
		QSort(A, start, left+1)
		QSort(A, right, end)```

标签:right,end,start,pivot,排序,left
来源: https://blog.csdn.net/LuffysMan/article/details/117080044

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

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

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

ICode9版权所有