【基本思想】
快速排序采用的是分治思想,即在一个无序的序列中选取一个任意的基准元素pivot,利用pivot将待排序的序列分成两部分,前面部分元素均小于或等于基准元素,后面部分均大于或等于基准元素,然后采用递归的方法分别对前后两部分重复上述操作,直到将无序序列排列成有序序列。
【排序流程】
快速排序算法通过多次比较和交换来实现排序,其排序流程如下:
1、首先设定一个分界值,通过该分界值将数组分成左右两部分。
2、将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于分界值,而右边部分中各元素都大于或等于分界值。
3、然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。
4、重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了。
【代码实现】
#记录比较次数
comp_count=0;
#定义交换函数
def exchange(arr,i,j):
arr[i], arr[j] = arr[j], arr[i]
#定义快速排序函数
def quick_sort(arr):
global comp_count # 声明count是全局变量
#如果是1个数,则不用排序,直接返回
if (len(arr) < 2):
return arr
#定义一个标志,记录左右指针的切换
isleft = False
#从最左边的数字开始
pivot_num = arr[0]
#定义左右指针
left_index = 0
right_index = len(arr) - 1
while True:
#右指针负责把比轴心数字小的,都移到轴心数字的左边
if isleft == False:
for i in range(right_index, left_index - 1, -1):
right_index = i
comp_count+=1
if arr[i] < pivot_num:
exchange(arr, i, left_index)
isleft = not isleft
break
# 左指针负责把比轴心数字大的,都移到轴心数字的右边
if isleft == True:
for i in range(left_index, right_index + 1, 1):
left_index = i
comp_count+=1
if arr[i] > pivot_num:
exchange(arr, i, right_index)
isleft = not isleft
break
#如果两个指针重合,一趟排序结束
if left_index==right_index:
#假如剩下的右侧序列中,所有数字比第一个(轴心数字大),则把右侧序列去掉第一个,然后递归调用排序函数
if right_index==0:
right_arr = arr[right_index + 1: len(arr)]
return [pivot_num] + quick_sort(right_arr)
#否则拆分左右两边,分别递归调用排序函数
else:
left_arr = arr[0:right_index]
right_arr = arr[right_index + 1: len(arr)]
return quick_sort(left_arr) + [pivot_num] + quick_sort(right_arr)
strarr=input("请输入一组数字,用英文逗号隔开:")
#input获得的输入值是字符串,需要转换成数字序列
arr=[int(x) for x in strarr.split(",")]
print("原始序列为",arr)
arr1=quick_sort(arr)
print("排序后序列为",arr1,"比较次数为",comp_count)
【运行截图】
【反馈】
由于代码是自己写的,可能出现一些问题,欢迎大家评论区讨论,大家互相学习呀~