快速排序(python)实现

news/2024/5/19 23:51:36 标签: python, 快速排序
python">快速排序
1. 介绍:
    快速排序使用分治法策略,把一个串行(list)分为两个子串行(sub - lists)。
    快速排序,快,而且效率高!它是处理大数据最快的排序算法之一了。
    快排的思想:首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,
    然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序2. 一趟快速排序的算法是:
    设置两个变量i、j,排序开始的时候:i = 0,j = N - 1;
    以第一个数组元素作为关键数据,赋值给key,即key = A[0];
    从j开始向前搜索,即由后开始向前搜索(j - -),找到第一个小于key的值A[j],将A[j]和A[i]互换;
    从i开始向后搜索,即由前开始向后搜索(i + +),找到第一个大于key的A[i],将A[i]和A[j]互换;
    重复第34步,直到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-完成的时候,此时令循环结束)。
3. 复杂度:
    时间复杂度:O(nlog₂n)
    空间复杂度:O(nlog₂n)
4. 稳定性:不稳定
'''
#方法一:
def quick_sort(myList,start,end):
    #判断low是否小于high,如果为false,直接返回
    if start < end:
        i,j = start,end
        #设置基准数
        base = myList[i]
        while i < j:
            #如果列表后边的数,比基准数大或相等,则前移一位直到有比基准数小的数出现
            while (i < j) and (myList[j] >= base):
                j = j - 1

            #如找到,则把第j个元素赋值给第个元素i,此时表中i,j个元素相等
            myList[i] = myList[j]

            #同样的方式比较前半区
            while (i < j) and (myList[i] <= base):
                i = i + 1
            myList[j] = myList[i]
        #做完第一轮比较之后,列表被分成了两个半区,并且i=j,需要将这个数设置回base
        myList[i] = base
        #递归前后半区
        quick_sort(myList, start, i - 1)
        quick_sort(myList, j + 1, end)
    return myList


list2= [1,5,3,6,7,2]
list3=quick_sort(list2,0,len(list2)-1)
print("快速排序:")
print(list3)

运行结果:

python">快速排序[1, 2, 3, 5, 6, 7]
python">#方法二
def quick_sort(list,start,end):          #对每一个元素进行排序
    count=1
    key=list[start]
    for i in range(start+1, end+1):
        if list[i]<=key:             #当遇到的值比基准值小的时候进行互换操作,并且count执行加一操作
            temp=list[i]
            list[i]=list[start+count]
            list[start+count]=temp
            count+=1

    for i in range(count-1):          #将所有元素整体前移一位
        list[start+i] = list[start+i+1]

    list[start+count-1] = key   #将基准值插入到指定位置

    return start+count-1       #返回下标

def arr_sort(list,frist,last):              #递归循环调用
    if last > frist:
        pkIndex=quick_sort(list,frist, last)             #返回key值得下标
        arr_sort(list,frist,pkIndex-1)                  #分别对前边部分和后半部分进行排序
        arr_sort(list,pkIndex+1,last)

def main():
    l=[5,3,0,8,9,6,4,2,1,7,8,9,0,6,37,88]
    arr_sort(l,0,len(l)-1)
    print(l)

if __name__ == "__main__":
    print('快速排序:')
    main()

运行结果:

python">快速排序[0, 0, 1, 2, 3, 4, 5, 6, 6, 7, 8, 8, 9, 9, 37, 88]

http://www.niftyadmin.cn/n/1097230.html

相关文章

IP地址202.117.17.254/22是什么地址?

2014下半年网络工程师 上午试卷 综合知识 IP地址202.117.17.254/22是什么地址&#xff1f; A.网络地址 B.全局广播地址 C.主机地址 D.定向广播地址 解析&#xff1a; 将IP地址202.117.17.254/22写成二进制 11001010 01110101 000100001 11111110 其中黄色的为网络地址&#xff…

Reverse Linked List II

Reverse a linked list from position m to n. Do it in-place and in one-pass. For example:Given 1->2->3->4->5->NULL, m 2 and n 4, return 1->4->3->2->5->NULL. Note:Given m, n satisfy the following condition:1 ≤ m ≤ n ≤ lengt…

kafka 1.1 创建Topic时分区分配分析

文章目录kafka 1.1 创建Topic时 分区分配分析分区副本分配方式不考虑机架因素进行分区分配主要方法assignReplicasToBrokersRackUnaware代码分区下标计算方法情况模拟考虑机架因素进行分区分配kafka 1.1 创建Topic时 分区分配分析 分区分配指的是为集群创建Topic时的partition…

安全需求可划分为物理安全、网络安全、系统安全和应用安全,下面的安全需求中属于系统安全的是(67),属于应用安全的是(68)。...

2015年上半年 网络工程师 上午试卷 综合知识 安全需求可划分为物理安全、网络安全、系统安全和应用安全&#xff0c;下面的安全需求中属于系统安全的是&#xff08;67&#xff09;&#xff0c;属于应用安全的是&#xff08;68&#xff09;。 A.机房安全 B.入侵检测 C.漏洞补丁…

堆排序(python)实现

def MAX_Heapify(heap,HeapSize,root):#在堆中做结构调整使得父节点的值大于子节点left 2*root 1right left 1larger rootif left < HeapSize and heap[larger] < heap[left]:larger leftif right < HeapSize and heap[larger] < heap[right]:larger righti…

一步步学习SPD2010--第十一章节--处理母版页(11)--关键点

一步步学习SPD2010--第十一章节--处理母版页&#xff08;11&#xff09;--关键点 母版页给你的网站上的所有页面维持一致的外观。它们将内容页的内容和母版页的布局结合&#xff0c;允许相同的功能在网站许多页面间共享。母版页和一般页面拥有相同的基础架构&#xff0c;只是文…

总线宽度为32bit,时钟频率为200MHz,若总线上每5个时钟周期传送一个32bit的字,则该总线的带宽为 (4) MB/S。...

2015年上半年 网络工程师 上午试卷 综合知识 总线宽度为32bit&#xff0c;时钟频率为200MHz&#xff0c;若总线上每5个时钟周期传送一个32bit的字,则该总线的带宽为 (4) MB/S。 A.40B.80C.160D.200 解析&#xff1a; 总线上每5个时钟周期传送一个32bit的字&#xff0c;我们将…

KafkaServer启动流程分析

KafkaServer启动流程分析 根据kafka的Server启动命令&#xff0c;寻找到启动入口Kafka类的main方法。 bin/zookeeper-server-start.sh config/zookeeper.propertiesKafka类的main方法 def main(args: Array[String]): Unit {try {val serverProps getPropsFromArgs(args)va…