快速排序 Python 模板

假设你已经掌握快速排序原理了,那么我们来写代码。

1.C++模板

#include<iostream>
using namespace std;
void quickSort(int q[],int l,int r){
	if(l >= r) return;
	int i = l-1,j = r+1,x = q[l+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]);
	}
	quickSort(q,l,j);
	quickSort(q,j+1,r);
}
int main(){
    int n = 8;
    int arr[8] = {8,3,1,1,9,6,7,2};
    quickSort(arr,0,n-1);                       //调用函数
    for(int i = 0;i<n;i++) printf("%d",arr[i]); //输出
}

2.Python版本

我看到很少有根据C++模板来写一份Python代码的,这里给的就是模拟了一下do...while...循环。

那么这个时候需要注意两点:

1.do...while...默认判断数组边界,Python代码中需要自己写一个边界判断函数

2.do...while...循环每次先运行一次,然后再判断条件。因此无论后边的条件真假与否,至少运行一次。

n = 8  #len(arr)
arr = [8,3,1,1,9,6,7,2]
cri = lambda x:False if x>=n or x<0 else True  #边界判断
def quickSort(l:int,r:int):
    if l >= r:return
    #这里注意赋值i = l-1,j = r-1,对应着后面的无论真假条件都先运行一次的情况
    i = l-1
    j = r+1
    mid = l+r>>1
    x = arr[mid]
    while i<j:
        #注意判断边界要写在前面,否则会出现数组越界
        #无论之后条件真假都要先运行一遍
        i+=1
        while cri(i) and arr[i]<x:i+=1
        j-=1
        while cri(j) and arr[j]>x:j-=1
        if i<j:arr[i],arr[j] = arr[j],arr[i]
    quickSort(l,j)
    quickSort(j+1,r)
quickSort(0,n-1)  #调用函数,因为arr作为全局变量,因此不需要写进函数参数里
for i in range(n):print(arr[i],end = ' ')  #输出arr数组(排好序后)

上一篇:一、OpenStack环境准备及共享组件安装


下一篇:bzoj 1415: [Noi2005]聪聪和可可