快速排序
1. 在列表数据中随机找到一个基数;
2. 将列表的第一个数的下标设置为左标记(left),列表的最后一个数的下标设置为右标记(right);
3. 先执行右标记(right),寻找比基数小的数;
4. 当右标记(right)找到比基数小的数时,将右标记处的数据和左标记处的数据进行交换;
5. 再执行左标记(left),寻找比基数大的数;
6. 当左标记找到比必输大的数时,将左标记处的数据与右标记处的数据进行交换;
7. 当左标记和右标记指向同一位置时,将基数放置到此处;
8. 经过一次循环,已经将基数左右两边的数据分开了,左边的数据都比基数小,右边的数据都比基数大。
9. 将分开的数据再次进行快速排序即可。
代码实现
1. 这里将基数设置为列表的第一个数
# --- coding: utf-8 --- # @Time : 2020/4/5 8:20 # @Author : Chester # @Email : 735936738@qq.com # @File : 1.py # @Software: PyCharm def query_sort(lists, left, right): if left >= right: # 判断传递的数据是否正确 return pivot = lists[left] # 确定基数 start = left # 确定左标记 end = right # 确定右标记 while start < end: # 开始循环 while start < end and lists[end] >= pivot: ''' 先从右标记开始执行,寻找比基数小的数 ''' end -= 1 # 当循环结束时,表示找到了比基数小的数,将左标记的值和右标记的值进行交换 lists[start] = lists[end] while start < end and lists[start] <= pivot: ''' 再开始执行左标记,寻找比基数大的数 ''' start += 1 # 当循环结束时,表示找到了比基数大的数,将左标记的值和右标记的值进行交换 lists[end] = lists[start] # 当外层大循环结束时,表示左右标记指向了相同的位置,所以将基数的位置换过去 lists[end] = pivot # 当一次循环执行结束后,基数的左面全都是比基数小的数,基数的右面全都是比基数大的数 # 将左边的列表进行快速排序 query_sort(lists, left, end - 1) # 将右边的列表进行快速排序 query_sort(lists, end + 1, right)
return lists if __name__ == '__main__': my_list = [0, 34, 123, 456, 2, 312, 43, 6] print('快速排序前的列表:') print(my_list) print('快速排序后的列表:') print(query_sort(my_list, 0, len(my_list) - 1))
代码详解
这层循环是为了实现右标记移动,并且寻找比基数小的数,当寻找到比基数小的数时,循环就不会在进行了。
while start < end and lists[end] >= pivot: end -= 1
这层循环是为了实现左标记移动,并且寻找比基数大的数,当寻找到比基数大的数时,循环就不会在进行了。
while start < end and lists[start] <= pivot: start += 1