假设你已经掌握快速排序原理了,那么我们来写代码。
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数组(排好序后)