基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
一趟快速排序的算法是:
1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];
3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]和A[i]互换;
4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;
5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)
# 定义一个函数将获取到的数组进行快排排序
def quick_sort(lists,left,right):#为排序的列表,左侧索引值,右侧索引值
#判断数组的大小,如果为空或者长度小于2直接返回
if lists == [] and lenth(lists)<2:
return
#递归过程中,若发现left>=right时,说明数组索引越界,排序完毕,返回数组
if left>=right:
return lists
#定义游标,相当于是C语言中的指针,不断地与key比较,来判断对应索引的值应该放在那
low = left
high = right
#参考值,用于比较,一般取最左边的元素
key = lists[low]
#当左侧索引值小于右侧索引值,才能进行排序
while low<high:
#当左侧索引值小于右侧索引值且右侧的元素要大于参考值时,才能进行排序
while low<high and lists[high]>key:
#右侧索引值自减
high -= 1
#否则将右侧元素赋值到左边
lists[low] = lists[high]
# 当左侧索引值小于右侧索引值且左侧的元素要小于参考值时,才能进行排序
while low<high and lists[low]<key:
# 左侧索引值自加
low += 1
# 否则将左侧元素赋值到右边
lists[high] = lists[low]
#否则将参考值赋值给high对应的值
lists[high] = key
#递归处理左侧元素
quick_sort(lists,left,low-1)
# 递归处理右侧元素
quick_sort(lists,low+1,right)
#返回排序好的数组
return lists
#定义一个数组
alists = [0,10,89,74,2,42,6]
#输出进行快排后的数组
print(quick_sort(alists,0,6))