快速排序

 

上面列出了快排的思路,下面我们整理下:

(1) 快排的思想基于归并排序,其空间复杂度为O(1)

(2) 一般情况下以第一个元素作为基准pivot,设置2个指针,左右指针分别指向index=0,和index=n-1的位置;

  首先right_index向左移动,没有找到right_index--,直至找到list[right_index]<pivot的元素,与left_index指向元素交换,left_index++

  其次left_index向右移动,没有找到left_index--,直至找到list[left_index]>pivot的元素,与right_index指向元素交换,right_index----

  当left_index=right_index,令list[left_index]=pivot 第一轮排序交换结束;得到pivot的左边元素值都小于pivot,右边大

(3) 递归的思想,pivot左边或者右边有分别执行这样的操作 

def QuickSort(array,left,right):
    # 递归的退出条件
    if left >= right:
        return 
    
    temp = array[left]
    i = left
    j = right
    
    while i<j:
        #两个指针,先动右边的指针,判断指针指向的元素是否小于基准元素,若小于,就要交换位置,移动到左边
        while array[j]>temp and i<j:
            j -= 1
        if array[j]<temp:
            #交换array[j]和array[i]
            array[i] = array[j]
            i += 1
        while array[i]<temp and i<j:
            i += 1
        if array[i]>temp:
            #交换array[j]和array[i]
            array[j] = array[i]
            j -= 1
     #退出循环后,i,j重合,此时所指向的位置为基准元素的位置
    array[i] = temp
    
    #对基准元素左边排序
    QuickSort(array,left,i-1)
    
    #对基准元素右边排序
    QuickSort(array,i+1,right)
    

if __name__ == "__main__":
    array = [30,40,60,10,20,50]
    left,right = 0,len(array)-1
    QuickSort(array,left,right)
    print(array) 

  

 

posted @ 2019-08-19 11:14  lililili——  阅读(177)  评论(0)    收藏  举报