Pyhton快速排序

本文展示了多种Python快速排序的实现方式,包括递归和原地分区方法,提供完整代码示例,并演示了去重与不去重排序结果。

作者:zhuge···预计阅读 15 分钟·605 阅读·0 评论
Pyhton快速排序

有几下几种 Pyhton快速排序方法

def quick_sort(num_list,repeat=False):
    if len(num_list) < 2:
        return num_list
    else:
        basenum = num_list[0]
        if repeat:
            left = [x for x in num_list[1:] if x <= basenum]
        else:
            left = [x for x in num_list[1:] if x < basenum]
        right = [x for x in num_list[1:] if x > basenum]
        return quick_sort(left,repeat) + [basenum] + quick_sort(right,repeat)

sql = [5, 3, 4, 1, 4, -2, 8, 7, 5, 9] #去重 print(quick_sort(sql)) #[-2, 1, 3, 4, 5, 7, 8, 9]

#不去重 print(quick_sort(sql,True)) #[-2, 1, 3, 4, 4, 5, 5, 7, 8, 9]


def quick_sort(array, start, end):
    if start >= end:
        return
    mid_data, left, right = array[start], start, end
    while left < right:
        while array[right] >= mid_data and left < right:
            right -= 1
        array[left] = array[right]
        while array[left] < mid_data and left < right:
            left += 1
        array[right] = array[left]
    array[left] = mid_data
    quick_sort(array, start, left-1)
    quick_sort(array, left+1, end)

if name == 'main': array = [10, 17, 50, 7, 30, 24, 27, 45, 15, 5, 36, 21] quick_sort(array, 0, len(array)-1) print(array) #[5, 7, 10, 15, 17, 21, 24, 27, 30, 36, 45, 50]

其它从网上摘的

def quick_sort(array, l, r):
  if l < r:
    q = partition(array, l, r)
    quick_sort(array, l, q - 1)
    quick_sort(array, q + 1, r)

def partition(array, l, r): x = array[r] i = l - 1 for j in range(l, r): if array[j] <= x: i += 1 array[i], array[j] = array[j], array[i] array[i + 1], array[r] = array[r], array[i+1] return i + 1

def quick_sort(lists,i,j):
    if i >= j:
        return list
    pivot = lists[i]
    low = i
    high = j
    while i < j:
        while i < j and lists[j] >= pivot:
            j -= 1
        lists[i]=lists[j]
        while i < j and lists[i] <=pivot:
            i += 1
        lists[j]=lists[i]
    lists[j] = pivot
    quick_sort(lists,low,i-1)
    quick_sort(lists,i+1,high)
    return lists
    
if __name__=="__main__":
    lists=[30,24,5,58,18,36,12,42,39]
    print("排序前的序列为:")
    for i in lists:
        print(i,end =" ")
    print("\
排序后的序列为:")
    for i in quick_sort(lists,0,len(lists)-1):
        print(i,end=" ")>>>排序前的序列为:30 24 5 58 18 36 12 42 39排序后的序列为:5 12 18 24 30 36 39 42 58


def quick_sort(num_list):
    #4.主函数调用,
    q_sort(num_list,0,len(num_list)-1)
    #5.调用q_sort()函数,实参 n_list列表,首项序列,最后元素序列传入

def q_sort(num_list,first,last): #6.传入实参给形参 if first < last: #7.条件判断, split = partition(num_list,first,last) #8.调用函数partition(),传入n_list,首项序列,末项序列实参 q_sort(num_list,first,split - 1) #递推,判断划分元素 q_sort(num_list,split + 1,last) #递推

def partition(num_list,first,last): #9.传入实参给形参 pivot = num_list[first] #10.选取列表中的第一个元素作为划分元素 left_mark = first + 1 #11.左坐标向右移动一格 right_mark = last #右坐标为末项序列 while True: while num_list[left_mark] <=pivot: #当左坐标元素小于等于划分元素时,左坐标自增1(从左到右序列+1)}|若列表中| if left_mark == right_mark: #如果左坐标等于右坐标时退出当前while循环 break left_mark +=1 while num_list[right_mark] > pivot: #当右坐标元素大于划分元素时,右坐标自减1,(从右到左序列-1) right_mark -= 1 if left_mark < right_mark: #如果左坐标所在元素大于划分元素,右坐标元素小于划分元素,交换两个坐标所指的元素 num_list[left_mark],num_list[right_mark] = num_list[right_mark],num_list[left_mark] else: break #左坐标超过了右坐标,退出当前循环 num_list[first],num_list[right_mark] = num_list[right_mark], num_list[first] #交换first处的划分元素和右坐标处的元素 return right_mark

n_list = [1,5,567,9,1,7] #1.生成列表 print(f'before:{n_list}')#2.打印当前序列 quick_sort(n_list)#3.调用quick_sort()函数,传入n_list实参 print(f'After:{n_list}') print(f'use function sorted:{sorted(n_list)}')

before:[1, 5, 567, 9, 1, 7] After:[1, 9, 567, 1, 5, 7] use function sorted:[1, 1, 5, 7, 9, 567]


相关文章

评论

加载中...