zoukankan      html  css  js  c++  java
  • python 快排+动态交换优化

    正常的代码,比较直观的:

    a = list([4,2,1,7,4,9,6,5,0,3,8]);
    print(a)
    
    def quicksort(left,right) :
    
        if left>right:
            return
        # 当i变为left值,第一次结束递归的条件是在左边的,当只有一个数后,递归的left传入本身,
        # right传入i-1,此时left是等于right的,减一后肯定小于left,此时return 结束此递归函数。此条件是判断只剩下一个数排序结束的情况
        tmp=a[left]
        i=left
        j=right
        while i!=j :
            print(a[j],tmp)
            while (a[j]>=tmp) & (i<j):
                j-=1
            while (a[i]<=tmp) & (i<j):
                i+=1
            if i<j :
                t=a[i]
                a[i]=a[j]
                a[j]=t
    
        a[left]=a[i]
        a[i]=tmp
    
        quicksort(left,i-1)
        quicksort(i+1,right)
        # 此处return结束的是这个quicksort函数
        return
    
    quicksort(0,len(a)-1)
    print(a)
    

    基本思想大家都知道吧,就是找到一个基准数后,从右边找小于基准数的,再从左边遍历,找大于基准数,然后把这两个找到的数交换,最后指针撞在一起的时候,指针位置的数和基准数交换。

    这个思想是最直观的,但是今天见识动态交换的思想,就是在移动中做下处理,不用最后特地交换找的数,指针移动更快

    def quicksort(l, r, arr):
        m = arr[l]
        i = l
        j = r
        while i < j:
            while (i<j and m <= arr[j]):
                j -= 1
            if i < j:
                # print(arr)
                arr[i] = arr[j]
                # print(arr)
                i += 1
            while (i<j and m >= arr[i]):
                i += 1
            if i < j:
                # print(arr)
                arr[j] = arr[i]
                j -= 1
                # print(arr)
        arr[i] = m
        # print(arr)
        if l < i-1: 
            quicksort(l, i-1, arr)
        if i+1 < r: 
            quicksort(i+1, r, arr)
    
    arr = [6,1,2,7,9,3,4,5,10,8]
    leng = len(arr)
    quicksort(0, leng-1, arr)
    print(arr)
    
    
  • 相关阅读:
    并查集
    结构体字节对齐
    Dijkstra算法(单源最短路径)
    图的遍历
    二叉树的非递归遍历
    浅谈C语言中的联合体
    二叉排序(查找)树
    KMP算法
    C语言文件操作解析(四)
    Trie树
  • 原文地址:https://www.cnblogs.com/zhangmingzhao/p/8138205.html
Copyright © 2011-2022 走看看