内部排序的方法实验报告_学习笔记-排序简单介绍

本文目的

本文旨在介绍排序的基础知识和相关概念,为后续章节做铺垫

排序是什么

排序(sorting)的功能是将一个数据元素的任意序列,重写排列成一个按关键字有序的序列。其确切的定义为:假设有n个数据元素的序列(R1,R2.,。。。,Rn),其相应关键字的序列是(K1,K2,。。。,Kn)。通过排序要求找出下标1,2,。。。,n的一种排列p1,p2,。。。,pn,使得相应关键字满足如下的非递减(或非递增)关系Kp 1<= Kp 2 <=…<= Kp n这样,就得到一个按关键字有序的记录序列:(Rp1,Rp2,。。。,Rpn)

内部排序和外部排序

3085c1d1be48d06d44a202db154a49c9.png

整个排序过程在内存储器中进行,称为内部排序。以下介绍的都是内部排序。我们常见的排序都是内部排序

由于待排序元素数量太大,以至于内存储器无法容纳全部数据,排序需要借助外存储设备才能完成,这类排序称为外部排序。

稳定排序和不稳定排序

如果在待排序的序列中存在多个具有相同关键字的元素,假设Ki = Kj(1<=i<=n,1<=j<=n,i != j),若在排序之前的序列中Ri在Rj之前,经过排序后得到的序列中Ri仍然在Rj之前,则称所用的排序方法是稳定的;否则,当相同关键字元素的前后关系在排序中发生编号,则称所用的排序方法是不稳定的。

简单的说,如果A=B,排序前A在B之前,排序结束后A还在B之前,排序就稳定,反之不稳定。

例如:有数据

0c62d5492185805ae0ec99aab0edcd74.png

原始数据

若排序后得到结果

2776ef0830c9c9224f07a8dcec8cf49a.png

稳定排序结果

则称该排序方法是稳定的

若排序后得到结果

944ee60dc5fcf7ce931d99249da484d4.png

不稳定排序结果

则称该排序方法是不稳定的。

无论是稳定的还是不稳定的排序方法,均能完成排序的功能。在某些场合可能对排序有稳定性的要求,此时就应当选择稳定的排序方法。

比较排序和非比较排序

0d0eda96a6d366a740488b950cad461d.png

大部分排序都是需要通过比较来判断大小,作为排序的依据的。但是也有例外的,比如计数排序、基数排序、不需要进行比较。

插入排序:将无序子序列中的多个记录"插入"到有序序列中,从而增加记录的有序子序列的长度。(详见学习笔记-详解直接插入排序,学习笔记-详解希尔排序)

交换排序:通过"交换"无序序列中的记录从而得到其中关键字最小或最大的记录,并将它加入到有序子序列中,以此方法增加记录的有序子序列长度。(详见学习笔记-详解冒泡排序,学习笔记-详解快速排序)

选择排序:从记录的无序子序列中"选择"关键字最小或最大的记录,并将它加入到有序子序列中,以此方法增加记录的有序子序列的长度。(详见学习笔记-详解简单选择排序,学习笔记-详解堆排序)

归并排序:通过"归并"两个或两个以上的记录有序子序列,逐步增加记录有序序列的长度。(详见学习笔记-详解归并排序)

此外还有基数排序,计数排序。(详见学习笔记-详解基数排序,学习笔记-详解计数排序)

算法复杂度

分为和。其作用: 是指执行算法所需要的计算工作量;而是指执行这个算法所需要的空间。(算法的复杂性体运行该算法时的计算机所需资源的多少上,资源最重要的是时间和空间(即)资源,因此复杂度分为时间和空间复杂度。)一个算法的优劣主要从算法的执行时间和所需要占用的存储空间两个方面。

对于一个算法,其和空间复杂度往往是相互影响的。当追求一个较好的时间复杂度时,可能会使空间复杂度的性能变差,即可能导致占用较多的存储空间;反之,当追求一个较好的空间复杂度时,可能会使时间复杂度的性能变差,即可能导致占用较长的运行时间。另外,算法的所有性能之间都存在着或多或少的相互影响。因此,当设计一个算法(特别是大型算法)时,要综合考虑算法的各项性能,算法的使用频率,算法处理的数据量的大小,算法描述语言的特性,算法运行的机器系统环境等各方面因素,才能够设计出比较好的算法。

时间复杂度

在中,时间复杂性,又称时间复杂度,的时间复杂度是一个,它定性描述该算法的运行时间。这是一个代表算法输入值的的长度的函数。时间复杂度常用表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是的,亦即考察输入值大小趋近无穷时的情况。

常见是时间复杂度

常数时间:若对于一个算法,T(n)的上界与输入大小无关,则称其具有常数时间,记作 O(1)时间。如果 T(n) =O(c),其中 c是一个常数,这记法等价于标准记法 T(n) =O(1)

对数时间:若算法的T(n) =O(logn),则称其具有对数时间。由于计算机使用的记数系统,常常以2为底(即log2n,有时写作lgn)。然而,由对数的,logan和logbn只有一个常数因子不同,这个因子在大O记法中被丢弃。因此记作O(logn),而不论对数的底是多少,是对数时间算法的标准记法。

常见的具有对数时间的算法有的相关操作和二分搜索。

线性时间:如果一个算法的时间复杂度为O(n),则称这个算法具有线性时间,或O(n)时间。非正式地说,这意味着对于足够大的输入,运行时间增加的大小与输入成线性关系。

线性对数时间:若一个算法时间复杂度T(n) = O(nlog n),则称这个算法具有线性对数时间。因此,从其表达式我们也可以看到,线性对数时间增长得比线性时间要快,但是对于任何含有n,且n的幂指数大于1的多项式时间来说,线性对数时间却增长得慢。

空间复杂度

空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度,记做S(n)=O(f(n))。比如直接的空间复杂度是O(1) 。而一般的算法就要有O(n)的空间复杂度了,因为每次递归都要存储返回信息。

常见排序算法

此处不过多赘述,后续将为大家一一介绍。

fcb9404f68df29e767947e5f26689a82.png

本文的初衷为学习笔记的分享,部分图文来源于网络,如侵,联删。

1.实验目的 掌握内排序,比较各种排序的优、缺点。 2 需求分析 2.1原理 2.1.1、直接排序 算法描述:经过i-1遍处理后,L[1..i-1]己排好序。第i遍处理仅将L[i]插入L[1..i-1]的适当位置,使得L[1..i]又是排好序的序列。要达到这个目的,我们可以用顺序比较的方法。首先比较L[i]和L[i-1],如果L[i-1]≤ L[i],则L[1..i]已排好序,第i遍处理就结束了;否则交换L[i]与L[i-1]的位置,继续比较L[i-1]和L[i-2],直到找到某一个位置j(1≤j≤i-1),使得L[j] ≤L[j+1]时为止。 2.1.2、冒泡排序 算法描述:核心思想是扫描数据清单,寻找出现乱序的两个相邻的项目。当找到这两个项目后,交换项目的位置然后继续扫描。重复上面的操作直到所有的项目都按顺序排好。 2.1.3、快速排序 算法描述:首先检查数据列表中的数据数,如果小于两个,则直接退出程序。如果有超过两个以上的数据,就选择一个分割点将数据分成两个部分,小于分割点的数据放在一组,其余的放在另一组,然后分别对两组数据排序。通常分割点的数据是随机选取的。这样无论你的数据是否已被排列过,你所分割成的两个字列表的大小是差不多的。而只要两个子列表的大小差不多。 2.1.4、选择排序 算法描述:首先找到数据清单中的最小的数据,然后将这个数据同第一个数据交换位置;接下来找第二小的数据,再将其同第二个数据交换位置,以此类推。 2.1.5、堆排序 (1) 基本思想:堆排序是一树形选择排序,在排序过程中,将R[1..N]看成是一颗完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系来选择最小的元素。 (2) 堆的定义: N个元素的序列K1,K2,K3,...,Kn.称为堆,当且仅当该序列满足特性: Ki≤K2i Ki ≤K2i+1(1≤ I≤ [N/2]) 2.1.6、希尔排序 算法描述:在直接插入排序算法中,每次插入一个数,使有序序列只增加1个节点,并且对插入下一个数没有提供任何帮助。如果比较相隔较远距离(称为增量)的数,使得数移动时能跨过多个元素,则进行一次比较就可能消除多个元素交换。 2.2要求 1.本程序对以下六种常用内部排序算法进行实测比较:冒泡排序,插入排序,选择排序,希尔排序,快速排序,堆排序。 2.排序的元素的关键字为整数。用正序,逆序,不同乱序的数据作测试比较。比较的指标为有关键字参加的比较次数和关键字的移动次数。 3.程序以人机对话的形式进行,每次测试完毕显示各种比较指标值 。 2.3任务 设计一个测试程序比较几种内部排序算法的关键字比较次数和移动次数以取得直观感受。 2.4运行环境 (1)WINDOWSXP系统 (2)C++ 编译环境 3.实验方法 本实验主要是内排序,通过比较的次数和移动的次数判断排序的好坏。主要子函数的说明如下。 1.简单选择排序XuanzePaixu(); 2.冒泡排序MaopaoPaixu(); 3. 直接插入排序CharuPaixu(); 4. 快速排序KuaisuPaixu(); 5. 堆排序DuiPaixu(); 6. 希尔排序 XierPaixu(); 以上的排序算法均采用书中所用的算法。程序采用输入的时候仅输入所要的个数,具体的输入数据由程序随机产生个数,并且输出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值