2022下半年 Acwing 第一篇:快排模板
原创
©著作权归作者所有:来自51CTO博客作者陈沧夜_的原创作品,请联系作者获取转载授权,否则将追究法律责任
前言
快排模板是现在必须掌握的一个排序方法。现在的公司面试越来越要求手写代码。所以学会常见的代码的模板还是很有必要的。
快速排序主要的思想主要是通过多次比较和交换来实现排序:
(1)首先设定一个分界值(建议取中间值:l+r>>1
),通过该分界值将数组分成左右两部分
(2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。这种情况下,左边部分中各元素都小于分界值,而右边部分中各元素都大于或等于分界值
(3)接下来开始递归,对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理
(4)重复上述过程,当左、右两个部分各数据排序完成后,整个数组的排序就完成了
模板内容:
C++ 模板
void quick(int q[],int l,int r){
if(l>=r) return;
int x = q[(l+r+1)>>1],i = l-1,j = r+1;
while(i<j){
do i++;while(q[i]<x);
do j--;while(q[j]>x);
if(i<j) swap(q[i],q[j]);
}
quick(q,l,i-1);
quick(q,i,r);
}
python模板
def quick_sort(l,r,data):
if l >= r:
return
i = l - 1
j = r + 1
x = data[(i+j) // 2]
while i < j:
while 1:
i += 1
if data[i] >= x:
break
while 1:
j -= 1
if data[j] <= x:
break
if i < j:
data[i],data[j] = data[j],data[i]
quick_sort(l,j,data)
quick_sort(j+1,r,data)
def main():
l = 0
r = n-1
quick_sort(l,r,data)
if __name__ == "__main__":
n = int(input())
data = [int(x) for x in input().split()]
main()
print(' '.join(list(map(str, data))))
C++ 中的 do...while
可以使用 python中的死循环替换修改:
C++ 格式:
python格式
while 1:
i += 1
if data[i] >= x:
break