python3快速排序
#算法导论中的快排
#理解 i:首先划分为 前段 + 后段 (这时候没有pivot)
#i 指向 前段的最后一个元素
#i+1 指向 后段的第一个元素
#前段都是小于等于 pivot,后段都是大于pivot
#一定有i<=j
def partition(a,low,high):
x=a[high]#轴点
i=low-1
for j in range(low,high):
if a[j]<=x:
i+=1
a[i],a[j]=a[j],a[i]
a[i+1],a[high]=a[high],a[i+1]
return i+1
def quickSort(a,low,high):
if low < high:
q=partition(a,low,high)
quickSort(a,low,q-1)
quickSort(a,q+1,high)
另外一种很好理解的写法
def quickSort(self,arr,left,right):
if left>right:
return
povit=arr[left]
i,j=left,right
while i<j:
while i<j and arr[j]>=povit:
j-=1
while i<j and arr[i]<=povit:
i+=1
if i<j:
arr[i],arr[j]=arr[j],arr[i]
arr[left]=arr[i]
arr[i]=povit
self.quickSort(arr,left,i-1)
self.quickSort(arr,i+1,right)
Java版本
//最简单的方法,全部加上等号
public static void quickSort(int[] arr,int l,int r){
//这个等号 可加 可不加
if(l>=r) return;
int povit = arr[l];
int i=l,j=r;
while(i<j){
//上面这个等号 可加 可不加
while(arr[j]>=povit && i<j) j--;
//下面这个等号一定要加
//不加会报错
while(arr[i]<=povit && i<j) i++;
if(i<j){
int tmp=arr[i];
arr[i]=arr[j];
arr[j]=tmp;
}
}
arr[l]=arr[i];
arr[i]=povit;
quickSort(arr,l,i-1);
quickSort(arr,i+1,r);
}