首页 > 系统相关 >Python 希尔排序(Shell Sort)原理以及应用

Python 希尔排序(Shell Sort)原理以及应用

时间:2023-04-29 18:56:01浏览次数:45  
标签:Sort arr Shell Python gap 希尔 排序 csv shellSort

希尔排序的原理:

  1. 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;

  2. 随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

希尔排序的原理是将待排序的序列按照一定间隔分成若干个子序列,对每个子序列使用插入排序进行排序,缩小间隔后再次进行排序,直到间隔为1时完成排序。简单来说,希尔排序就是在插入排序的基础上引入了间隔序列,通过逐渐缩小间隔的方式来提高排序效率。

希尔排序的应用:

在 Python 中,我们可以使用希尔排序来对大规模数据进行排序操作。由于 Python 的内置排序函数 sorted().sort() 等都是采用 Timsort 排序算法,而希尔排序的时间复杂度比 Timsort 高,所以在实际工作中通常不会直接使用希尔排序。但是,在某些特定场景下,希尔排序仍然有其优势,例如排序较小规模的数据时,希尔排序可能比其他排序算法更快速,因此在这样的场景中可以考虑使用希尔排序。

希尔排序:

def shellSort(arr):
    n = len(arr)
    gap = 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 //= 2

# 测试代码
arr = [12, 3, 45, 23, 6, 78, 43, 56]
shellSort(arr)
print(arr)  # 输出 [3, 6, 12, 23, 43, 45, 56, 78]

在上面的代码中,我们定义了一个名为 shellSort 的函数来实现希尔排序。该函数接收一个列表作为输入参数,并对其进行排序。在函数体内,首先获取列表的长度 n,然后设置间隔 gap 的初值为 n // 2。接着,使用一个 while 循环来不断缩小间隔 gap 的值。在 while 循环体内,使用一个 for 循环来遍历每个子序列,并对其进行插入排序。最后输出排序后的列表。

希尔排序的时间复杂度为 O(nlogn) 或者 O(n^2),取决于间隔序列的选择,但它通常表现比简单的插入排序要好得多。而且,由于希尔排序的实现较为简单,所以也是常用的排序算法之一。

实例应用:

假设我们现在需要对一个存储着 1000 个学生信息的 CSV 文件进行按照年龄排序,可以借助希尔排序算法实现。

由于数据量较大,所以运用希尔排序可能会比其他算法更快速地完成排序操作,并且处理过程相对简单,不需要太多额外的代码实现

以下是使用 Python 实现希尔排序的代码示例:

import csv

def shellSort(arr):
    n = len(arr)
    gap = n // 2
    
    while gap > 0:
        for i in range(gap, n):
            temp = arr[i]
            j = i
            
            while j >= gap and arr[j - gap]['age'] > temp['age']:
                arr[j] = arr[j - gap]
                j -= gap
            
            arr[j] = temp
        gap //= 2

# 读取 CSV 文件中的数据并存储到列表中
students = []
with open('students.csv', 'r') as f:
    reader = csv.DictReader(f)
    for row in reader:
        students.append(row)

# 对学生信息按照年龄排序
shellSort(students)

# 将排序后的结果输出为新的 CSV 文件
headers = ['name', 'age', 'gender', 'grade']
with open('sorted_students.csv', 'w', newline='') as f:
    writer = csv.DictWriter(f, headers)
    writer.writeheader()
    writer.writerows(students)

上面的代码首先使用 csv 模块读取输入 CSV 文件中的学生信息,并将其存储到一个列表中。然后,使用自定义的 shellSort() 函数对学生信息按照年龄进行排序。最后,将排序后的结果输出为另一个 CSV 文件。

该程序的主要优点在于使用了自定义的排序算法,可以在处理大量数据时提高效率和速度,并且代码易于实现和维护。

标签:Sort,arr,Shell,Python,gap,希尔,排序,csv,shellSort
From: https://www.cnblogs.com/wwho/p/17364367.html

相关文章

  • Python之路【第十七篇】:Django【进阶篇】
    原博客笔记链接:https://www.cnblogs.com/wupeiqi/articles/5246483.html 1.Model到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞:创建数据库,设计表结构和字段使用MySQLdb来连接数据库,并编写数据访问层代码业务逻辑层去调用数据访问层执行数......
  • [oeasy]python0143_主控程序_main
    主控程序回忆上次内容上次把apple.py拆分成了输入主函数引用模块中变量的时候要带上包(module)名get_fruits.aget_fruits.b最终拆分代码成功!可以将程序再拆分成输入输出然后再由主函数调用吗?......
  • [oeasy]python0143_主控程序_main
    主控程序回忆上次内容上次把apple.py拆分成了输入主函数 引用模块中变量的时候要带上包(module)名get_fruits.aget_fruits.b  最终拆分代码成功! 可以将程序再拆分成输入输出 然后再由主函......
  • Python之路【第十六篇】:Django【基础篇】
    原博客教材链接:https://www.cnblogs.com/wupeiqi/articles/5237704.html Python的WEB框架有Django、Tornado、Flask等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM、模型绑定、模板引擎、缓存、Session等诸多功能。 1.基本配置1.1创建django程......
  • python 读写mdb
    Python中可以使用pyodbc模块连接MicrosoftAccess数据库(.mdb格式)。首先需要先安装pyodbc模块和MicrosoftAccess驱动程序,可以使用pip安装pyodbc:```pipinstallpyodbc```然后需要下载安装MicrosoftAccess驱动程序,下载链接:https://www.microsoft.com/zh-cn/download/details......
  • Python之路【第十五篇】:Web框架
    原笔记链接:https://www.cnblogs.com/wupeiqi/p/4592637.html1.Web框架本质众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端。#!/usr/bin/envpython#coding:utf-8importsocketdefhandle_request(client):......
  • python 读写sqlite3 读写内存中的数据库
    Python中,可以使用标准库sqlite3来读写SQLite数据库。下面是一个示例代码,展示如何连接到SQLite数据库,创建表格,插入数据,查询数据和关闭数据库:importsqlite3#连接到数据库conn=sqlite3.connect('example.db')#创建一个表格conn.execute('''CREATETABLEIFNOTE......
  • 136python可视化图
    灵感:来自朋友让我帮它弄可视化图,持续更新,后期可直接套用EXCEL文件CSV文件例子1csv布局效果:代码如下:#@author:zhc#@Time:2023/4/29#@FileName:demo2importpandasaspdclassBar_429:defstart(self):self.__testA_wy()self.__te......
  • 基于python实现将AWS-ElastiCache-的Reserved_Cache_Nodes-预留节点及费用的信息统计
    在AWS-ElastiCache中,Reserved_Cache_Nodes-预留节点,也就类似于EC2与RDS的RI(预留实例),都是为了节省成本而选择预付费用的一种方式,当AWS账号有多个时,如何通过编程的方式批量获取所有账号所有区域Region的RN信息呢我们可以通过awscli的方式,也可以通过AWSSDKforPython(Boto3)的......
  • Shell列表操作
    字符串列表定义方法已空格分割a=(1234)输出列表所有元素echo${a[*]}输出列表下标echo${!a[*]}输出列表长度echo${#a[*]}列表循环foriin${a[*]}doecho$idone使用列表实现数值排序#冒泡算法a=(1345078974)#获取列表长度len=${#a[@]}echo......