快速排序的重点在于如何分区,首先从数组中选取一个基准值,然后把小于基准值的元素放到左边,大于基准值的元素放到右边。如下图所示
c实现
#include <stdio.h>
int partition(int L[],int lb,int ub){
int find,down,up,tmp;
find = L[lb];
down = lb;
up = ub;
while(down < up){
while(L[down] <= find && down < ub){
down ++;
}
while(L[up] > find){
//这里判断条件可以省略 && up>lb,因为当up=lb时,L[up]=find,也会退出循环
up --;
}
if(down < up){
tmp = L[down];
L[down] = L[up];
L[up] = tmp;
}
}
L[lb] = L[up];
L[up] = find;
return up;
}
void quickSort(int L[],int lb,int ub){
int pos;
if(lb > ub){
return;
}
pos = partition(L,lb,ub);
quickSort(L,lb,pos-1);
quickSort(L,pos+1,ub);
}
int main(){
int L[10] = {9,8,7,6,5,4,3,2,1,0};
int i;
quickSort(L,0,9);
for(i=0;i<10;i++){
printf("%d-",L[i]);
}
getchar();
}
python实现
#quickSort
def partition(L,lb,ub,key):
target = L[lb]
down = lb
up = ub
while down < up:
while key(L[down]) <= key(target) and down < ub:
down += 1
while key(L[up]) > key(target):
up -= 1
if down < up:
L[down],L[up] = L[up],L[down]
L[up],L[lb] = L[lb],L[up]
return up
def quickSort(L,lb,ub,key):
if lb > ub:
return
pos = partition(L,lb,ub,key)
quickSort(L,lb,pos-1,key)
quickSort(L,pos+1,ub,key)
if __name__ == '__main__':
L1 = [11,32,45,32,24,31,42,35]
L2 = ['afs','aef','her','ragr','hswdge']
quickSort(L1,0,len(L1)-1,key=lambda item:item)
quickSort(L2,0,len(L2)-1,key=lambda item:item[1])
print L1,L2
另外一种分区方法
####快速排序
def partition(L,i,j):
val = L[i]
h = i
k = i + 1
while k <= j:
if L[k] < val:
h = h + 1
tmp = L[k]
L[k] = L[h]
L[h] = tmp
k = k + 1
tmp = L[h]
L[h] = L[i]
L[i] = tmp
return h
def quickSort(L,i,j):
if i < j:
p = partition(L,i,j)
quickSort(L,i,p-1)
quickSort(L,p+1,j)
L = [8,7,6,5,4,3,2,1]
quickSort(L,0,len(L)-1)
print L