快速排序.

快速排序

这是从其他佬们博文中学到的

#快速排序 传入列表、开始位置和结束位置
def quick_sort( li , start , end ):
    # 如果start和end碰头了,说明要我排的这个子数列就剩下一个数了,就不用排序了
    if not start < end :
        return

    mid = li[start] #拿出第一个数当作基准数mid
    low = start   #low来标记左侧从基准数始找比mid大的数的位置
    high = end  #high来标记右侧end向左找比mid小的数的位置

    # 我们要进行循环,只要low和high没有碰头就一直进行,当low和high相等说明碰头了
    while low < high :
        #从high开始向左,找到第一个比mid小或者等于mid的数,标记位置,(如果high的数比mid大,我们就左移high)
        # 并且我们要确定找到之前,如果low和high碰头了,也不找了
        while low < high and li[high] > mid :
            high -= 1
        #跳出while后,high所在的下标就是找到的右侧比mid小的数
        #把找到的数放到左侧的空位 low 标记了这个空位
        li[low] = li[high]
        # 从low开始向右,找到第一个比mid大的数,标记位置,(如果low的数小于等于mid,我们就右移low)
        # 并且我们要确定找到之前,如果low和high碰头了,也不找了
        while low < high and li[low] <= mid :
            low += 1
        #跳出while循环后low所在的下标就是左侧比mid大的数所在位置
        # 我们把找到的数放在右侧空位上,high标记了这个空位
        li[high] = li[low]
        #以上我们完成了一次 从右侧找到一个小数移到左侧,从左侧找到一个大数移动到右侧
    #当这个while跳出来之后相当于low和high碰头了,我们把mid所在位置放在这个空位
    li[low] = mid
    #这个时候mid左侧看的数都比mid小,mid右侧的数都比mid大

    #然后我们对mid左侧所有数进行上述的排序
    quick_sort( li , start, low-1 )
    #我们mid右侧所有数进行上述排序
    quick_sort( li , low +1 , end )
 

#ok我们实践一下
if __name__ == '__main__':
    li = [5,4,3,2,1]
    quick_sort(li , 0 , len(li) -1 )
    print(li)

下面这个用C++写的,差不多

int quick(int *data, int left, int right)
{
    if (left<right)
    {
        int i = left;
        int j = right;
        int key = data[left];

        while (i < j)
        {
            while (i < j && data[j] > key)
            {
                j--;
            }
            data[i] = data[j];

            while (i < j && data[i] <= key)
            {
                i++;
            }
            data[j] = data[i];
        }

        data[i] = key;

        quick(data, left, i - 1);
        quick(data, i + 1, right);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值