首页 > 编程语言 >Python 冒泡排序,选择排序,归并排序, 希尔排序 算法 及测试

Python 冒泡排序,选择排序,归并排序, 希尔排序 算法 及测试

时间:2022-10-07 10:56:37浏览次数:55  
标签:sort arr Python self 冒泡排序 test 排序 def

  • 使用代码实现冒泡排序,选择排序,归并排序, 希尔排序4中算法完成下列任务。
  1. 对1~100000序列打乱顺序,使用上述4种排序算法进行排序。
  2. 每种算法排序重复100次
  3. 排序过程中记录每次排序所需的时间
  4. 统计每一种排序所使用时间的最大值,最小值和平均值。

排序算法

class Sort:

    @staticmethod
    def bubble_sort(arr):
        for i in range(1, len(arr)):
            for j in range(0, len(arr) - i):
                if arr[j] > arr[j + 1]:
                    arr[j], arr[j + 1] = arr[j + 1], arr[j]
        return arr

    @staticmethod
    def quick_sort(arr, i=None, j=None):
        if i is None:
            i = 0
        if j is None:
            j = len(arr) - 1

        if i >= j:
            return arr
        pivot = arr[i]
        low = i
        high = j
        while i < j:
            while i < j and arr[j] >= pivot:
                j -= 1
            arr[i] = arr[j]
            while i < j and arr[i] <= pivot:
                i += 1
            arr[j] = arr[i]
        arr[j] = pivot
        Sort.quick_sort(arr, low, i - 1)
        Sort.quick_sort(arr, i + 1, high)

        return arr

    @staticmethod
    def selection_sort(arr):

        for i in range(len(arr)):

            min_idx = i
            for j in range(i + 1, len(arr)):
                if arr[min_idx] > arr[j]:
                    min_idx = j

            arr[i], arr[min_idx] = arr[min_idx], arr[i]
        return arr

    @staticmethod
    def merge_sort(arr):

        def merge(Left, Right):
            result = []
            while Left and Right:
                if Left[0] <= Right[0]:
                    result.append(Left.pop(0))
                else:
                    result.append(Right.pop(0))
            while Left:
                result.append(Left.pop(0))
            while Right:
                result.append(Right.pop(0))
            return result

        import math
        if len(arr) < 2:
            return arr
        middle = math.floor(len(arr) / 2)
        left, right = arr[0:middle], arr[middle:]
        return merge(Sort.merge_sort(left), Sort.merge_sort(right))

    @staticmethod
    def shell_sort(arr):
        n = len(arr)
        gap = int(n / 2)

        while gap > 0:

            for i in range(gap, n):

                temp = arr[i]
                j = i
                while j >= gap and arr[j - gap] > temp:
                    arr[j] = arr[j - gap]
                    j -= gap
                arr[j] = temp
            gap = int(gap / 2)
        return arr

测试类


import datetime
import random
import threading
from copy import copy

from numpy import mean

from zy1.Sort import Sort


# 生成1~100000


class TestSort:

    def __init__(self, k=1):
        '''

        :param k: 生成 数列的范围: [i for i in range(1, 10 ** k+1)]
        '''
        self.arr = [i for i in range(1, 10 ** k + 1)]

    def fc2(self, func, des: str):
        """

        :param func: 排序方法
        :param des: 对当前排序方法的描述用于输出提示
        :return:
        """

        def tis(sort_fun, des):
            times = []
            arr1 = copy(self.arr)
            for i in range(100):
                random.shuffle(arr1)
                t1 = datetime.datetime.now()
                sort_fun(arr1)
                t2 = datetime.datetime.now() - t1
                times.append(t2.total_seconds())
            else:
                evg = round(float(mean(times)), 6)
                print(f'{des} \t max ={max(times)}  \t min={min(times)} \t evg={evg}')

        t1 = threading.Thread(target=tis, args=(func, des))
        t1.start()
        print(f"{des} 线程id:{t1.native_id}")

    def test_bubble_sort(self):
        self.fc2(Sort.bubble_sort, '冒泡排序')

    def test_quick_sort(self):
        self.fc2(Sort.quick_sort, '快速排序')

    def test_selection_sort(self):
        self.fc2(Sort.selection_sort, '选择排序')

    def test_merge_sort(self):
        self.fc2(Sort.merge_sort, '归并排序')

    def test_shell_sort(self):
        self.fc2(Sort.shell_sort, '希尔排序')


测试代码


from zy1.SortTest import TestSort

test1 = TestSort(k=5)

test1.test_bubble_sort()
test1.test_selection_sort()
test1.test_merge_sort()
test1.test_shell_sort()
test1.test_quick_sort()

测试结果

快速排序 	 max =4.422002  	 min=1.108573 	 evg=2.153202
希尔排序 	 max =8.791003  	 min=3.210291 	 evg=4.801248
归并排序 	 max =12.64344  	 min=3.401489 	 evg=5.964642
...

标签:sort,arr,Python,self,冒泡排序,test,排序,def
From: https://www.cnblogs.com/boran/p/16759229.html

相关文章

  • Python基础(十二) | 还不会python绘图?两万字博文教你Matplotlib库(超详细总结)
    ⭐本专栏旨在对Python的基础语法进行详解,精炼地总结语法中的重点,详解难点,面向零基础及入门的学习者,通过专栏的学习可以熟练掌握python编程,同时为后续的数据分析,机器学习及深......
  • Python 实现自动google翻译
    留学的时候学习了几年法语,回国后逐渐生疏,一个朋友说帮忙翻译一些东西,但还是有点吃力,想着前面研究的爬虫知识,能否自动完成翻译呢,话不多说,开整。整体的爬虫思考可以参看之前的......
  • Python第三方库管理Pip和Conda
    在本机开发完程序后,需要把程序移植到服务器之类的目标机上运行,或者分发给其余同事,经常会遇到第三方库管理,或者是不同项目之间用到的第三方库版本不一致,例如有时候需要tensor......
  • 手撕堆排序(含图解,代码)
    本篇重点1.什么是堆,有什么特性?2.堆排序概述3.堆排序图解4.代码5.堆排序时间复杂度/空间复杂度/稳定性6.堆排序/堆适用场景什么是堆1.堆是完全二叉树。一棵......
  • Python语法之模块和包
    这一节,我将为大家介绍模块和包:在开发大型软件时,随着代码写的越来越多,如果将所有的代码都放在一个文件里,势必为以后的维护带来很大的困难。正如仓颉造字一样,仓颉是黄帝的史......
  • [oeasy]教您玩转python - 0005- 勇闯地下城
    继续运行......
  • 【Python】【爬虫】爬虫问题:requests的content和text
    爬虫问题:requests的content和text通常来说,text获取的是Unicode编码的文本数据,content获取的是byte类型的二进制数据,比如获取图片本身、PDF文件之类的,可以用content。但是......
  • python文字转语音
    pip安装pyttsx3pipinstallpyttsx3代码示例importpyttsx3engine=pyttsx3.init()#engine.say("Beautifulisbetterthanugly.")#engine.say("轻轻地,我走了......
  • [oeasy]教您玩转python - 0005- 勇闯地下城
     ​ 继续运行......
  • python-the second week
    python-thesecondweek目录python-thesecondweek数据类型数据类型之bool数据类型之tuple数据类型之set用户交互格式化输出基本运算符常用赋值符逻辑运算符成员运算符身......