pyhton3 一些排序算法概括

Posted wang666

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pyhton3 一些排序算法概括相关的知识,希望对你有一定的参考价值。

1、冒泡算法

import random
import datetime

def maopao(data):
    # 检测是否排序完成
    for i in range(len(data)-1):
        flag = False
        for j in range(len(data)-1-i):
            if data[j]>data[j+1]:
                data[j],data[j+1]=data[j+1],data[j]
                flag = True
        if not flag:
            break

    return data



test_data=list(range(1,50000))
random.shuffle(test_data)  #打乱顺序
time1=datetime.datetime.now()
print(test_data)

test_data=maopao(test_data)
time2=datetime.datetime.now()

print(test_data,readtime:,time2-time1)

 

如上排序了50000个乱序的数,耗时0:04:23.190000,性能有点差;

时间复杂度为O(N^2)

 

2、插入排序

import random
import datetime

def insertSort(arr):
    length = len(arr)
    for i in range(1,length):
        x = arr[i]
        for j in range(i,-1,-1):
        # j为当前位置,试探j-1位置
            if x < arr[j-1]:
                arr[j] = arr[j-1]
            else:
                # 位置确定为j
                break
        arr[j] = x
    return arr

test_data = list(range(50000))
random.shuffle(test_data)
time1=datetime.datetime.now()
print(test_data)

test_data=insertSort(test_data)
time2=datetime.datetime.now()
print(test_data,readtime:,time2-time1)

 

如上排序了50000个乱序的数,耗时 0:01:43,性能一般般;

时间复杂度为:O(n^2/2)

 

3、归并算法

import random
import datetime

def merge_sort(li):
    #不断递归调用自己一直到拆分成成单个元素的时候就返回这个元素,不再拆分了
    if len(li) == 1:
        return li

    #取拆分的中间位置
    mid = len(li) // 2
    #拆分过后左右两侧子串
    left = li[:mid]
    right = li[mid:]

    #对拆分过后的左右再拆分 一直到只有一个元素为止
    #最后一次递归时候ll和lr都会接到一个元素的列表
    # 最后一次递归之前的ll和rl会接收到排好序的子序列
    ll = merge_sort(left)
    rl = merge_sort(right)

    # 我们对返回的两个拆分结果进行排序后合并再返回正确顺序的子列表
    # 这里我们调用拎一个函数帮助我们按顺序合并ll和lr
    return merge(ll,rl)

#这里接收两个列表
def merge(left,right):
    # 从两个有顺序的列表里边依次取数据比较后放入result
    # 每次我们分别拿出两个列表中最小的数比较,把较小的放入result
    result = []
    while len(left)>0 and len(right)>0 :
        #为了保持稳定性,当遇到相等的时候优先把左侧的数放进结果列表,因为left本来也是大数列中比较靠左的
        if left[0] <= right[0]:
            result.append(left.pop(0))
        else:
            result.append(right.pop(0))
    #while循环出来之后 说明其中一个数组没有数据了,我们把另一个数组添加到结果数组后面
    result += left
    result += right
    return result

if __name__ == __main__:
    li = list(range(50000))
    random.shuffle(li)
    print(li)
    time1=datetime.datetime.now()
    li=merge_sort(li)
    time2=datetime.datetime.now()
    print(li,readtime:,time2-time1)

 

如上排序了50000个乱序的数,耗时 0:00:00.603000,性能还可以;

时间复杂度为:O(N*log(N))

 

4、快速排序

以上是关于pyhton3 一些排序算法概括的主要内容,如果未能解决你的问题,请参考以下文章

10分钟看懂10大经典算法(Swift代码实现)

十大经典排序算法动画与解析,看我就够了!(配代码完全版)

(附代码)动图图解 | 十大经典排序算法Python版实现

动画图解:十大经典排序算法动画与解析,看我就够了!(配代码完全版)

排序算法

7种基本排序算法的Java实现