快速排序:python实现 归并(高级排序法)

快速排序:python实现 归并(高级排序法)

维基百科:
快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort),简称快排,一种排序算法,最早由东尼·霍尔提出。在平均状况下,排序 n个项目要O(nlog n)次比较。在最坏状况下则需要O(n^2) 次比较,但这种状况并不常见。事实上,快速排序通常明显比其他算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地达成。
快速排序思路:

1,挑选基准值:从数列中选出一个元素,称为“基准”(pivot)(一般选最左端的)
2, 分割:重新排序数列,把所有比基准值小的放在基准这前面,所有比基准值大的放在基准值后面 (与基准值相等的随意)分割完成之后对基准值的排序就已完成。
3,递归排序子数列:递归地将小于基准元素的子序列和大于基准元素的子序列排序
例如:[3,4,2,6,7,1,5]

  • 令pivot =3,i=0,j=4 j从右向左发现比基准3小的数(1)停下,i从左到右发现比基准3大的数(4)停下,交换两者的位置,此时数列变成[3,1,2,6,7,4,5],j 继续向左前进,j 在2处停下,i继续向右前进,在2的位置 i和j相遇,此时交换2与基准3 ,列表变成[2,1,3,6,7,4,5]第一轮结束,此时列表中基准3 左边的都比3小,右边的都比3 大
  • 在把小于基准的子序列[3,1]和大于基准的子序列[6,7,4,5]按照上面的方法排序……直到序列中只剩下一个元素是停下

不罗嗦了,上代码:

# 快速排序(经典算法)
def quick_-sort(li,left,right):
    if left > right:
        return
    pivot = li[left]#定一个基准
    i = left
    j = right
    while i != j:
        while li[j] >= pivot and i < j:#从左边找比基准大的数
            j -= 1
        while li[i] <= pivot and i < j:#从右边找比基准小的数
            i += 1
        if i < j:
            li[i],li[j] = li[j],li[i]
    li[left] = li[i]
    li [i] = pivot
    quick_sort(li,left,i-1)
    quick_sort(li,i+1,right)
li=[]
l =input('请输入要排序的数据(用,分隔开):')
l = l.split(',')
for i in l:
    i = int(i)
    li.append(i)
print(f'需要排序的数据:{li}')
quick_sort(li,0,len(li)-1)
print(f"排完序:{li}")

这里我还想说明的一点是,当时我在码代码的时候是先遍历的i,后遍历的j,但是这时候结果出现错误,我发现当先遍历i的情况下,最后当i=j是对应的数可能会比基准值大,这样再交换,第一轮完事后,基准值左边的有比基准值大的数,所以结果会出现错误,下面是我对先遍历i的代码修正

def quick_sort(li,left,right):
    if left > right:
        return
    pivot = li[left]
    i = left
    j = right
    while i != j:
        while li[i] <= pivot and i < j:
            i += 1
        while li[j] >= pivot and i < j:
            j -= 1
        if i < j:
            li[i],li[j] = li[j],li[i]
    if li[i] <= pivot:#这里我做了一个条件判断,避免了前面的问题
        li[left] = li[i]#当li[i]<=时就和经典的情况完全一致
        li [i] = pivot
        quick_sort(li, left, i - 1)
        quick_sort(li, i + 1, right)
    else:#当li[i]>pivot时向前移一个就好了
        li[left] = li[i-1]
        li[i-1] = pivot
        quick_sort(li,left,i-2)
        quick_sort(li,i,right)
li=[]
l =input('请输入要排序的数据(用,分隔开):')
l = l.split(',')
for i in l:
    i = int(i)
    li.append(i)
print(f'需要排序的数据:{li}')
quick_sort(li,0,len(li)-1)
print(f"排完序:{li}")

你可能感兴趣的:(python算法)