python 快速排序
快速排序,⼜称划分交换排序
1.通过⼀趟排序将要排序的数据分割成独⽴的两部分,
其中⼀部分的所有数据都⽐另外⼀部分的所有数据都要⼩
2.然后再按此⽅法对这两部分数据分别进⾏快速排序,整个排序过程可以递归进⾏,以此达到整个数据变成有序序列。
步骤为:
从数列中挑出⼀个元素,称为"基准"(pivot)
重新排序数列,所有元素⽐基准值⼩的摆放在基准前⾯,所有元素⽐基准值⼤的摆在基准的后⾯(相同的数可以到任⼀边)。
在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
递归地(recursive)把⼩于基准值元素的⼦数列和⼤于基准值元素的⼦
数列排序。
递归的最底部情形,是数列的⼤⼩是零或⼀,也就是永远都已经被排序好了。虽然⼀直递归下去,但是这个算法总会结束,因为在每次的迭代(iteration)中,它⾄少会把⼀个元素摆到它最后的位置去。
方法一
# 完成一轮排序过程
def sub_sort(list_,low,high):
# 基准数
x = list_[low]
while low < high:
# 后面的数小于x放到前面的空位
while list_[high] >= x and high > low:
high -= 1
list_[low] = list_[high] # 将数往前甩
while list_[low] < x and low < high:
low += 1
list_[high] = list_[low]
list_[low] = x # 将基准数插入
return low
# 快排 low 第一个数序列号 high 最后一个数序列号
def quick(list_,low,high):
if low < high:
key = sub_sort(list_,low,high)
quick(list_,low,key - 1)
quick(list_, key+1, high)
#快速排序 方法一
quicker = [7,12,29,31,6,3]
quick(quicker,0,5)
print(quicker)
方法二
def quickSort(data,start,end):
i = start
j =end
if i>=j:
return
flag =data[start]
while i<j:
while i<j and data[j]>=flag:
j-=1
temp=data[j]
data[i] =data[j]
while i<j and data[i]<=flag:
i+=1
data[j]=data[i]
data[i]=flag
quickSort(data,start,i-1)
quickSort(data,i+1,end)
#方法二的快速排序
data = [45,3,2,6,78,5,33,22,65,46]
quickSort(data,0,len(data)-1)
print(data)
其实两种方法的快速排序是一样的,快速排序的程序挺不好理解的。不常用总忘,笔试面试还考。
这里引用其他人的程序,我有加了我的方法。以此铭记