首页 > 编程语言 >常见排序的python实现

常见排序的python实现

时间:2023-10-01 15:23:38浏览次数:45  
标签:arr end python 常见 timeit globals return 排序

常见排序的python实现

import numpy as np
import timeit
import matplotlib.pyplot as plt
## 生成测试序列
def GenerateArray(n, N=1000):
    orginArray = np.random.randint(N, size=n).tolist()
    return orginArray

orginArray = GenerateArray(20)
print(orginArray)
[662, 176, 688, 180, 206, 620, 911, 669, 391, 976, 868, 240, 197, 956, 975, 655, 316, 457, 908, 618]

插入排序

对于序列 \((a_1, a_2, \cdots, a_n)\) 中的每一个数,判断其在已排序好的序列中的位置,并插入。时间复杂度 \(O(n^2)\).

# 插入排序
def InsertSort(arr):
    for j, key in enumerate(arr):
        i = j - 1
        while(i >= 0 and arr[i] > key):
            arr[i+1] = arr[i]
            i -= 1
        arr[i+1] = key
    return arr

t = timeit.timeit(setup="arr = GenerateArray(10000)", stmt="InsertSort(arr)", globals=globals(), number=1)
print("插入排序 10000 个数字 t = {:.3f} s.".format(t))
插入排序 10600 个数字 t = 4.892 s.

选择排序

对于序列 \((a_1, a_2, \cdots, a_n)\),不断选择剩余列 \(a[i:]\) 中的最小元素并和 \(a_i\) 交换。时间复杂度 \(O(n^2)\).

# 选择排序
def SelectSort(arr):
    for i in range(len(arr)-1):
        min_index = i
        for j, x in enumerate(arr[i+1:]):
            if x < arr[min_index]:
                min_index = j+i+1
        arr[i], arr[min_index] = arr[min_index], arr[i]
    return

t = timeit.timeit(setup="arr = GenerateArray(10000)", stmt="SelectSort(arr)", globals=globals(), number=1)
print("选择排序 10000 个数字 t = {:.3f} s.".format(t))
选择排序 12500 个数字 t = 4.838 s.

归并排序

不断将序列二分,直至最小单元后归并,归并两有序数组,速度快。时间复杂度 \(O(n\log n)\).

# 归并排序
def MergeSort(arr, begin=0, **end):
    def Merge(arr, begin, n, end): # 归并arr[:n]和arr[n:]
        L = arr[begin:n] + [np.inf]
        R = arr[n:end] + [np.inf]
        i, j = 0, 0
        for k in range(begin, end):
            if L[i] < R[j]:
                arr[k] = L[i]
                i += 1
            else:
                arr[k] = R[j]
                j += 1
        return
    # 分治
    if not end:
        end = len(arr)
    else:
        end = end['end']
    length = end - begin
    if length <= 1:
        return
    n = length // 2 + begin
    MergeSort(arr, begin=begin, end=n)      # 排序前length/2项
    MergeSort(arr, begin=n, end=end)        # 排序后length/2项
    Merge(arr, begin=begin, n=n, end=end)   # 归并
    return


t = timeit.timeit(setup="arr = GenerateArray(500000)", stmt="MergeSort(arr)", globals=globals(), number=1)
print("归并排序 500000 个数字 t = {:.3f} s.".format(t))
归并排序 500000 个数字 t = 2.253 s.

快速排序

随机(或二分)地将序列划分为两段,将小于基准值的移到左边,大于基准值的移到右边。递归上述过程。

def QuickSort(arr):    
    """快速排序"""    
    if len(arr) >= 2:  # 递归入口及出口        
        mid = arr[len(arr)//2]  # 选取基准值,也可以选取第一个或最后一个元素        
        left, right = [], []  # 定义基准值左右两侧的列表        
        arr.remove(mid)  # 从原始数组中移除基准值        
        for x in arr:            
            if x >= mid:                
                right.append(x)            
            else:                
                left.append(x)        
        return QuickSort(left) + [mid] + QuickSort(right)    
    else:        
        return arr
t = timeit.timeit(setup="arr = GenerateArray(500000)", stmt="QuickSort(arr)", globals=globals(), number=1)
print("快速排序 500000 个数字 t = {:.3f} s.".format(t))
快速排序 100000 个数字 t = 11.367 s.

标签:arr,end,python,常见,timeit,globals,return,排序
From: https://www.cnblogs.com/zhang-js/p/17738864.html

相关文章

  • 34. 在排序数组中查找元素的第一个和最后一个位置
    给你一个按照非递减顺序排列的整数数组nums,和一个目标值target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值target,返回[-1,-1]。你必须设计并实现时间复杂度为O(logn)的算法解决此问题。示例1:输入:nums=[5,7,7,8,8,10],target=8......
  • python 获取城市所属省份
    获取城市所属省份defgetProvince(cityValue):area_data={'北京':['北京市','朝阳区','海淀区','通州区','房山区','丰台区','昌平区','大兴区','顺义区','西城区','延......
  • 二十四点游戏Python实现
    二十四点游戏是一种数学益智游戏,通过组合四个数字和四种基本运算符(加、减、乘、除),使得计算结果等于24。在本文中,我们将使用Python语言实现这个游戏。一、游戏规则1、从给定的四个数字中选取任意两个数字,并选择一个运算符进行计算。2、将计算结果与剩余的两个数字结合,再选择一个运算......
  • Python代码转换成C++
    Python和C++是两种不同的编程语言,但它们都有各自的优势和适用场景。在某些情况下,我们可能需要将Python代码转换成C++代码,以获得更高的执行效率或更好的性能。本文将从多个方面介绍如何将Python代码转换为C++代码。一、代码结构Python和C++在代码结构上存在一些差异。Python是一种解......
  • Python监控数据库内容
    本文将从多个方面详细阐述使用Python监控数据库内容的方法和技巧。一、连接数据库在Python中,我们可以使用不同的库来连接不同类型的数据库,常用的有MySQL、SQLite、PostgreSQL等。这里以MySQL为例:importpymysql#连接数据库defconnect_database():try:conn=py......
  • 轻松完成图像处理任务的Python工具
    随着数字时代的到来,图像处理技术越来越重要。Python作为一门功能强大、易学易用的编程语言,自然也成为了图像处理领域的一把好手。Python提供了很多开源工具,可以帮助我们轻松完成各种图像处理任务。本文将介绍几种可用于图像处理的Python工具。一、PillowPillow是Python图像处理领域......
  • python拷贝文件
    在Python中拷贝文件可以使用shutil模块importshutil#源文件路径src_file='/path/to/source/file.txt'#目标文件路径dst_file='/path/to/destination/file.txt'#使用shutil模块的copy2函数进行拷贝shutil.copy2(src_file,dst_file) 在这个示例中,shutil.cop......
  • docker启动常见应用
    #MySQL限制0.5个CPU和0.5G内存dockerpullmysql:5.7dockerrun-itd--namemysql-p3306--cpu-period=1000000--cpu-quota=500000--memory512M--rm-eMYSQL_ROOT_PASSWORD=rootmysql:5.7#本地连接dockerexec-itmysqlmysql-hlocalhost-uroot-proot#远程......
  • python中对列表的元素进行计数
     001、方法1 借助字典统计[root@pc1test2]#lstest.py[root@pc1test2]#cattest.py##测试程序#!/usr/bin/envpython3#-*-coding:utf-8-*-list1=["aa","bb","aa","cc","aa","dd",&qu......
  • 拟合不同的冷却方式(分类变量)下,物料温度加入两个分类变量, 物料类型和冷却方式, 给
    在机器学习中,拟合不同冷却方式下物料温度随时间下降的规律可以使用不同的算法和方法。以下是四种常见的方法,它们可以用来生成数据集、拟合模型、解释参数和输出函数方程,以及解释它们的实际意义。线性回归:方法:线性回归是一种用于拟合线性关系的方法,通过寻找最佳拟合直线来预测温度随......