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、快速排序

猜你喜欢

转载自www.cnblogs.com/wang666/p/9849712.html