网站大量收购独家精品文档,联系QQ:2885784924

常用排序算法比较与分析报告.doc

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
. . . 常用排序算法比较与分析 ?一、常用排序算法简述 下面主要从排序算法的基本概念、原理出发,分别从算法的时间复杂度、空间复杂度、算法的稳定性和速度等方面进行分析比较。依据待排序的问题大小(记录数量 n)的不同,排序过程中需要的存储器空间也不同,由此将排序算法分为两大类:【内排序】、【外排序】。 内排序:指排序时数据元素全部存放在计算机的随机存储器RAM中。 外排序:待排序记录的数量很大,以致内存一次不能容纳全部记录,在排序过程中还需要对外存进行访问的排序过程。 先了解一下常见排序算法的分类关系(见图1-1) 图1-1 常见排序算法 二、内排序相关算法 2.1 插入排序 核心思想:将一个待排序的数据元素插入到前面已经排好序的数列中的适当位置,使数据元素依然有序,直到待排序数据元素全部插入完为止。 2.1.1 直接插入排序 核心思想:将欲插入的第i个数据元素的关键码与前面已经排序好的i-1、i-2 、i-3、 … 数据元素的值进行顺序比较,通过这种线性搜索的方法找到第i个数据元素的插入位置 ,并且原来位置 的数据元素顺序后移,直到全部排好顺序。 直接插入排序中,关键词相同的数据元素将保持原有位置不变,所以该算法是稳定的,时间复杂度的最坏值为平方阶O(n2),空间复杂度为常数阶O(l)。 Python源代码: #-------------------------直接插入排序--------------------------------? def?insert_sort(data_list):? ?#遍历数组中的所有元素,其中0号索引元素默认已排序,因此从1开始? ?for?x?in?range(1,?len(data_list)):? ?#将该元素与已排序好的前序数组依次比较,如果该元素小,则交换? ?#range(x-1,-1,-1):从x-1倒序循环到0? ?for?i?in?range(x-1,?-1,?-1):? ?#判断:如果符合条件则交换? ?if?data_list[i]??data_list[i+1]:? ?temp?=?data_list[i+1]? ?data_list[i+1]?=?data_list[i]? ?data_list[i]?=?temp? 2.1.2 希尔排序 核心思想:是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。 希尔排序时间复杂度会比O(n2)好一些,然而,多次插入排序中,第一次插入排序是稳定的,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,所以希尔排序是不稳定的。 Python源代码: #-------------------------希尔排序-------------------------------? def?insert_shell(data_list):? ?#初始化step值,此处利用序列长度的一半为其赋值? ?group?=?int(len(data_list)/2)? ?#第一层循环:依次改变group值对列表进行分组? ?while?group??0:? ?#下面:利用直接插入排序的思想对分组数据进行排序? ?#range(group,len(data_list)):从group开始? ?for?i?in?range(group,?len(data_list)):? ?#range(x-group,-1,-group):从x-group开始与选定元素开始倒序比较,每个比较元素之间间隔group? ?for?j?in?range(i-group,?-1,?-group):? ?#如果该组当中两个元素满足交换条件,则进行交换? ?if?data_list[j]??data_list[j+group]:? ?temp?=?data_list[j+group]? ?data_list[j+group]?=?data_list[j]? ?data_list[j]?=?temp? ?#while循环条件折半? ?group?=?int(group?/?2)? 2.2 选择排序 核心思想:每一趟扫描时,从待排序的数据元素中选出关键码最小或最大的一个元素,顺序放在已经排好顺序序列的最后,直到全部待排序的数据元素排完为止。 2.2.1 直接选择排序 核心思想:给每个位置选择关键码最小的数据元素,即:选择最小的元素与第一个位置的元素交换,然后在剩下的元素中再选择最小的与第二个位置的元素交换,直到倒数第二个元素和最后一个元素比较为止。 根据其基本思想,每当扫描一趟时,如果当前元素比一个元素小,而且这个小元素又出现在一个和当前

文档评论(0)

smdh + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档