排序算法性能比较 python

冒泡排序、选择排序

堆排序、归并排序、快速排序

计数排序

import json
import random
import time

import matplotlib
import pandas


def Bubble_Sort(num):
    # 冒泡排序
    for i in range(len(num)-1):
        for j in range(len(num)-i-1):
            if num[j] > num[j+1]:
                num[j], num[j+1] = num[j+1], num[j]


def Selection_Sort(num):
    # 选择排序
    for i in range(0, len(num)-1):
        key = i
        for j in range(i+1, len(num)):
            if num[key] > num[j]:
                key = j
        if key != i:
            num[i], num[key] = num[key], num[i]


def Count_Sort(num, length):
    # 计数排序
    buff = [0 for i in range(0, length+1)]
    result = [0 for i in range(0, len(num))]
    for i in range(0, len(num)):
        # result.append(0)
        buff[num[i]] += 1
    # buff[i]中存放的是原始数据num[]中等于i的个数
    for i in range(1, length+1):
        buff[i] += buff[i-1]
    # buff[i]现在存放的是小于等于i的个数
    for i in range(len(num)-1, -1, -1):
        result[buff[num[i]]-1] = num[i]
        buff[num[i]] -= 1
    return result


def Merge(num, left, mid, right):
    # 归并排序中的 左右合并
    num_left = num[left:mid+1]
    num_right = num[mid+1:right+1]
    num_result = []
    while len(num_left) > 0 and len(num_right) > 0:
        if num_left[0] < num_right[0]:
            num_result.append(num_left.pop(0))
        else:
            num_result.append(num_right.pop(0))
    num_result += num_left
    num_result += num_right

    for i in range(left, right+1):
        num[i] = num_result[i-left]


def Merge_Sort(num, left, right):
    # 归并排序
    if left < right:
        mid = int((left+right)/2)
        Merge_Sort(num, left, mid)
        Merge_Sort(num, mid+1, right)
        Merge(num, left, mid, right)


def Max_Heapify(num, i, length):
    # 堆化 维护堆的性质
    # 下标从0开始 到length-1 结束
    left_child_location = 2*i+1
    right_child_location = 2*i+2

    if left_child_location <= length-1 and num[left_child_location] > num[i]:
        lagest = left_child_location
    else:
        lagest = i
    if right_child_location <= length-1 and num[right_child_location] > num[lagest]:
        lagest = right_child_location
    if lagest != i:
        num[i], num[lagest] = num[lagest], num[i]
        Max_Heapify(num, lagest, length)


def Build_Max_Heap(num):
    # 建堆 从无序数组中建最大堆
    for i in range(int((len(num)-2)/2), -1, -1):
        Max_Heapify(num, i, len(num))


def Heap_Sort(num):
    # 堆排序
    Build_Max_Heap(num)
    length = len(num)
    for i in range(len(num)-1, 0, -1):
        num[i], num[0] = num[0], num[i]
        length -= 1
        Max_Heapify(num, 0, length)


def Partition(num, left, right):
    # 以左边的数为基准   小的放基准左边 大的放的基准右边
    key = num[left]
    while left < right:
        while left < right and num[right] >= key:
            right = right-1
        if left < right:
            num[left] = num[right]
        while left < right and num[left] < key:
            left = left+1
        if left < right:
            num[right] = num[left]
        num[left] = key
    return left
    # 返回基准下标


def Quick_Sort(num, left, right):
    # 快速排序
    if left < right:
        key = Partition(num, left, right)
        Quick_Sort(num, left, key-1)
        Quick_Sort(num, key+1, right)


Max = 500000
# 随机数最大值


result_time = {}
# 存放所有运行时间的结果

for length in range(10000, 140000, 20000):
    # 数组长度

    # 生成随机数写入text.txt文件
    with open('text.txt', 'w+') as f:
        for i in range(0, length):
            f.write(str(random.randint(0, Max))+"\n")
        # 随机数 下限0 上限Max
    num = []
    # num中存放测试数据,保持数据一致性
    with open('text.txt', 'r+') as f:
        for line in f:
            num.append(int(line))
    # 从text.txt中读入需要排序的数据
    save_date = tuple(num)
    run_time = {}
    # 存放一组排序的运行时间
    result_time[length] = run_time
    print("\n**********"+str(length)+"**********")

    for i in range(0, 5):
        num = list(save_date)

        time_start = time.time()
        # 计时_开始时间
        if i == 0:
            num.sort()
            time_end = time.time()
            # 计时_结束时间
            run_time["sort"] = time_end-time_start
            print("sort:", run_time["sort"])
            with open("Result_sort.txt", "w+") as f:
                # 排序后结果存入Result_QuickSort.txt中
                for i in range(0, len(num)):
                    f.write(str(num[i])+"\n")

        elif i == 1:
            # 快速排序
            Quick_Sort(num, 0, len(num)-1)
            time_end = time.time()
            # 计时_结束时间
            run_time["Quick_Sort"] = time_end-time_start
            print("Quick_Sort:", run_time["Quick_Sort"])
            with open("Result_QuickSort.txt", "w+") as f:
                # 排序后结果存入Result_QuickSort.txt中
                for i in range(0, len(num)):
                    f.write(str(num[i])+"\n")

        elif i == 2:
            # 堆排序
            Heap_Sort(num)
            time_end = time.time()
            # 计时_结束时间
            run_time["Heap_Sort"] = time_end-time_start
            print("Heap_Sort:", run_time["Heap_Sort"])
            with open("Result_HeapSort.txt", "w+") as f:
                # 排序后结果存入Result_HeapSort.txt中
                for i in range(0, len(num)):
                    f.write(str(num[i])+"\n")

        elif i == 3:
            # 计数排序
            result = Count_Sort(num, Max)
            time_end = time.time()
            # 计时_结束时间
            run_time["Count_Sort"] = time_end-time_start
            print("Count_Sort:", run_time["Count_Sort"])
            with open("Result_CountSort.txt", "w+") as f:
                # 排序后结果存入Result_CountSort.txt中
                for i in range(0, len(result)):
                    f.write(str(result[i])+"\n")

        elif i == 4:
             # 归并排序
            Merge_Sort(num, 0, len(num)-1)
            time_end = time.time()
            # 计时_结束时间
            run_time["Merge_Sort"] = time_end-time_start
            print("Merge_Sort:", run_time["Merge_Sort"])
            with open("Result_MergeSort.txt", "w+") as f:
                # 排序后结果存入Result_MergeSort.txt中
                for i in range(0, len(num)):
                    f.write(str(num[i])+"\n")

        elif i == 5:
            # 选择排序
            Selection_Sort(num)
            time_end = time.time()
            # 计时_结束时间
            run_time["Selection_Sort"] = time_end-time_start
            print("Selection_Sort:", run_time["Selection_Sort"])
            with open("Result_SelectionSort.txt", "w+") as f:
                # 排序后结果存入Result_SelectionSort.txt中
                for i in range(0, len(num)):
                    f.write(str(num[i])+"\n")
  
        elif i == 6:
            # 冒泡排序
            Bubble_Sort(num)
            time_end = time.time()
            # 计时_结束时间
            run_time["Bubble_Sort"] = time_end-time_start
            print("Bubble_Sort:", run_time["Bubble_Sort"])
            with open("Result_BubbleSort.txt", "w+") as f:
             # 排序后结果存入Result_BubbleSort.txt中
                for i in range(0, len(num)):
                    f.write(str(num[i])+"\n")


with open("result_time.xls", "w+") as f:
        # 最后的运行时间存入result_time.xls的表格文档
    # 这里似乎有问题
    for key1 in result_time:
        f.write(str(key1))
        for key2 in result_time[key1]:
            f.write("\t")
            f.write(key2+"\t")
            f.write(str(result_time[key1][key2]))
            f.write("\n")
with open("result_time.json", "w+") as f:
        # 所有运行时间存入.json文档中
    json.dump(result_time, f)

# df = pandas.DataFrame(books).T.fillna(0)
df = pandas.DataFrame(result_time).T
print(df)

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值