快速排序

快速排序的重点在于如何分区,首先从数组中选取一个基准值,然后把小于基准值的元素放到左边,大于基准值的元素放到右边。如下图所示
快排
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

另外一种分区方法
partition

####快速排序
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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值