快速排序算法的实现(python程序代码)

本文详细介绍了快速排序算法,包括其基本思想(分治法),排序流程步骤,以及如何通过递归和交换操作实现。同时提供了Python代码示例,展示了如何计数比较次数并进行排序过程。
摘要由CSDN通过智能技术生成

【基本思想】       

        快速排序采用的是分治思想,即在一个无序的序列中选取一个任意的基准元素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)

【运行截图】

【反馈】

由于代码是自己写的,可能出现一些问题,欢迎大家评论区讨论,大家互相学习呀~

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值