1
.直接插入排序
假设待排序的记录存放在数组
R[0….n-1]
中,排序过程的某一中间时刻,
R
被划分成两个子区间
R[0…i-1]
和
R[i….n-1]
,其中:前一个子区间是已排好序的有序区;后一个子区间则是当前未排序的部分。直接插入排序的基本操作是将当前无序区的第
1
个记录
R[i]
插入到有序区
R[0….i-1]
中适当的位置,使
R[0…i]
变为新的有序区。
2.
希尔排序
先取定一个小于
n
的整数
d
作为第一个增量,把表的全部记录分成
d
组,所有距离为
d1
的倍数的记录放在同一组中,在各组内进行直接插入排序;然后取第二个增量
d2<d1
,重复上述的分组和排序,直至增量
d
=
1
,即所有记录放在同一组中进行直接插入排序为止。
3.
冒泡排序
通过无序区中相邻记录关键字间的比较和位置的交换,使关键字最小的记录逐渐向上升。整个算法是从最下面的记录开始,对每两个个相邻的关键字进行比较,且使关键字小的记录换至关键字较大的位置,使得经过一趟冒泡排序后,关键字最小的记录到达最上端,接着再在剩下的记录中找关键字次小的记录,并把它换至第二个位置上。依此类推,一直到所有记录都有序为止。
4.
快速排序
在待排序的
n
个记录中任取一个记录(通常取第一个记录),把该记录放入最终位置后,数据序列被此记录分割成两部分。所有比它大的记录放置在后一部分,所有比它小的记录放置在前一部分,并把该记录排在这两部分之间,这个过程称作一趟快速排序。之后对所有的两部分分别重复上述过程,直至每部分内只有一个记录为止。简而言之,每趟使表的第一个元素入终位,将表一分为二,对子表按递归方式继续这种划分,直至划分的子表长为
1
。
5.
选择排序
基本思想:第
i
趟排序开始时,当前有序区和无序区分别为
R[0….i-1]
和
R[i…n-1],
该趟排序则是从无序区中选出关键字最小的记录
R[k],
它与无序区的第一个记录
R[i]
交换
,
使
R[0…i]
和
R[i+1…n]
分别变为新的有序区和无序区。因为每趟排序使有序区中增加一个记录,且有序区的记录均不大于无序区中记录的关键字,即第
i
趟排序之后
R[0…i]
的所有关键字等于
R[i+1..n-1]
中的所有关键字
,
所以进行
n-1
趟之后有
R[0..n-2]
的所有关键字小于等于其后所有关键字
,
也就是说
,
经过
n-1
趟排序后
,
整个表
R[0..n-1]
递增有序
.
6.
堆排序
堆排序是在排序过程中,将顺序表中存储的数据看成是一棵完全而叉树,利用完全二叉树中双亲结点和孩子结点之间的内在联系来选择关键字最小记录。具体做法是:把待排序的表的关键字存放在数组
R[1…n]
之中,将
R
看成一棵二叉树,每个结点表示一个记录,原表的第一个记录
R[1]
作为二叉树的根,以下各记录
R[2..n]
依次逐层从左到右顺序排序,构成一棵完全二叉树,任意结点
R[i]
的左孩子是
R[2i+1]
,右孩子是
R[2i+2]
,双亲是
R[i/2]
。
7.
归并排序
归并排序是多次将两个或两个以上的有序表合并成一个新的有序表以两个有序表的合并为例:每次从两个有序表中取出一个记录进行关键字的比较,将较小的放入一个临时数组,最后将各段中余下的部分直接复制到临时数组。这样临时数组就是一个有序表。
8
.基数排序
以
r
为基数的最低位优先基数排序的过程是:假设线形表由结点序列
a0
,
a1
,
…a(n-1)
构成每个结点
aj
的关键字由
d
元组(
)。在排序过程中使用
r
个队列
Q0
,
Q1
,
…..Qr-1
。排序过程如下:
对
i=0
,
1
,
…..
,
d-1
,依次做一次“分配”
”
收集
”
(其实就是一次稳定的排序过程)。
分配:开始时,把
Q0
,
Q1
,
…Qr-1
各个队列置成空队列,然后依次考察线性表中的每一个结点
aj
(
j=0
,
1…
,
n-1
),如果
aj
的关键字
,就把
aj
放进
Qk
队列中。
收集:把
Q0
,
Q1
,
….
,
Qr-1
各个队列中的结点依次首尾相接,得到新的结点序列,从而组成新的线性表。
调试分析
1.
本程序经过多次调试才得以通过执行,从插入排序到基数排序,每一个都经过亲自调试
2.
本人觉得本题中最难的是基数排序,在本程序中,我使用递归等方法才做出
3.
对本程序的时空分析如下
各排序的对比,交换次数如下表:(以下数据为比较次数与数据移动次数之和)
|
少量数据
|
大量数据
|
顺序数据
|
逆序数据
|
插入排序
|
20
|
556
|
9
|
65
|
希尔排序
|
47
|
1245
|
42
|
58
|
冒泡排序
|
56
|
1732
|
45
|
110
|
快速排序
|
157
|
203
|
63
|
67
|
选择排序
|
72
|
1474
|
90
|
80
|
堆排序
|
65
|
617
|
68
|
39
|
归并排序
|
19
|
94
|
19
|
40
|
基数排序
|
40
|
200
|
20
|
22
|
由上表可知,在忽略辅助空间的情况考虑,无论运行少量数据和大量数据,归并排序占优,而当数据有序时,插入排序占优,主要因为实现该排序时的算法用了一个辅助数组,大大减少了数据的移动次数,数据完全逆序时,堆排序效率最高。
a)
从平均时间性能而言,快速排序最佳,其所需时间最省,但快速排序在最坏情况
下的时间性能为
O(n*n)
不如堆排序和归并排序
O(n*logn)
。而后两者相比较的结果是,在
n
较大时,
归并排序所需的时间较堆排序省,但它所需的辅助存储量最多。
i.
单排序中以直接排序最简单,当序列的记录基本有序或n较小时,它是最佳的排序方法。
ii.
数排序的时间复杂度较小。因此最适用于
n
值很大的时候而关键字较小的序列。若关键字也很大,而序列中的大多数记录的最高位关键字均不同,则亦可先按最高位关键字不同将序列分成若干小的子序列,而后进行直接插入排序。
iii.
从方法的稳定性来比较,基数排序是稳定的内排方法,所有时间复杂度为
O
(
n*n
)的简单排序也是稳定的,然而,快速排序,堆排序和希尔排序等时间性
能
较好的排序方法都是不稳定的,一般来说,排序过程中的比较是在相临的两个记录关键字间进行的排序方法都是稳定的。由于大多数情况下排序是按记录的主关键字进行的,则所用的排序方法是否稳定无关紧要。若排序按记录的次关键字进行,则应根据问题所需慎重选择排序方法及其描叙算法。
综上所叙,在这些排序方法中没有哪一中是绝对最优的,有的适用于
n
较大的情况,有的适用于
n
较小的情况,因此,在实用时需要根据不同的情况适当选用,甚至可以将多种方法综合起来使用。
算法的时空分析和改进设想
详细内容请看http://student.zjzk.cn/course_ware/data_structure/web/paixu/paixu8.2.2.1.htm
- 大小: 2.6 KB
- 大小: 1.3 KB
分享到:
相关推荐
但根据文件标题《数据结构中各种排序算法的比较与分析.pdf》和标签《数据结构 数据分析 大数据 参考文献 专业指导》,可以推测文件内容应该是一篇对不同排序算法进行比较和分析的学术或教学材料。 以下是对数据结构...
数据结构中的各种排序的方法,比如说希尔排序,冒泡排序等等
本资源包“数据结构-各种排序完整示例程序”提供了C语言实现的各种经典排序算法,帮助学习者深入理解并掌握这些算法的实际应用。 1. 希尔排序(Shell Sort): 希尔排序是一种基于插入排序的算法,通过将待排序数组...
1、链表排序 [问题描述] 建立一个...设计要求:利用随机函数产生10个样本,每个样本有20000随机整数,利用直接插入排序、希尔排序,冒泡排序、快速排序、选择排序、堆排序,归并排序,基数排序八种排序方法进行排序
本篇将深入探讨数据结构中的各种排序方法,包括基本概念、分类、重要术语以及具体的排序算法。 1. **排序的基本概念** - 排序,又称分类,是指将一个元素顺序随机的序列转化为按关键字有序的序列。关键字是用于...
数据结构实验 各种排序的实现数据结构实验 各种排序的实现数据结构实验 各种排序的实现数据结构实验 各种排序的实现数据结构实验 各种排序的实现数据结构实验 各种排序的实现数据结构实验 各种排序的实现数据结构...
数据结构各种排序算法实现及比较 在本文中,我们将讨论各种排序算法的实现和比较,包括简单选择排序、直接插入排序、希尔排序、冒泡排序、快速排序等。这些算法都是数据结构课程设计报告中常用的排序算法。 简单...
数据结构学习笔记排序算法:基数排序数据结构学习笔记排序算法:基数排序数据结构学习笔记排序算法:基数排序数据结构学习笔记排序算法:基数排序数据结构学习笔记排序算法:基数排序数据结构学习笔记排序算法:基数...
在每一轮排序中,它将元素按照增量分组进行插入排序,然后逐渐减小增量,直到增量为1,此时执行最后一次插入排序,使整个序列有序。希尔排序的时间复杂度通常比直接插入排序要好,但不如其他高级排序算法。 3. 快速...
数据结构是计算机科学中的核心部分,它探讨了如何有效地存储和组织数据,以便进行高效的查询、更新和操作。在这个压缩包文件中,我们重点关注的是排序算法,它是数据处理中的常见任务,尤其在处理大量数据时至关重要...
本项目"数据结构课程设计(各种排序)"主要关注的是各种排序算法的实现,包括直接插入排序、希尔排序、直接选择排序、冒泡排序、快速排序、堆排序以及二路归并排序。这些排序算法在实际编程中有着广泛的应用,理解...
数据结构各种算法总结,冒泡法等排序算法的比较,有助于更深刻的理解
数据结构课程设计是计算机科学与技术专业中一项重要的实践性教学环节,主要目的是让学生深入理解并熟练掌握数据结构的基本概念、原理以及应用。在“排序综合课程设计”中,学生通常会被要求实现多种排序算法,并对...
总的来说,二叉排序树是一种实用的数据结构,广泛应用于各种需要高效查找和排序的场景,例如数据库索引、文件系统等。学习如何生成和操作二叉排序树是提升编程能力和理解数据结构精髓的重要步骤。通过实践和代码分析...
这篇“数据结构各种内排序性能比较课程设计报告”旨在通过对比多种排序算法,了解它们的性能差异,以便在实际应用中选择最适合的方法。以下是几种排序算法的详细说明: 1. **冒泡排序**(Bubble Sort): 冒泡排序...
在计算机科学领域,数据结构与算法是至关重要的基础,而排序则是其中不可或缺的一部分。排序算法是用于重新组织数据序列,使其按照特定标准(如升序或降序)排列的算法。这里我们将深入探讨标题和描述中提及的一些...
数据结构是计算机科学中的核心课程之一,而内部排序则是数据结构中的重要组成部分,它涉及到如何高效地对大量数据进行排序。严蔚敏教授的《数据结构》是一本经典的教材,其中第十章专门讲解了内部排序算法。内部排序...
数据结构是计算机科学的基础课程,拓扑排序是数据结构中的一种重要算法。拓扑排序是一种基于有向无环图(DAG)的排序算法,可以应用于教学计划的安排。根据课程之间的依赖关系,拓扑排序可以生成一个符合逻辑的教学...
数据结构中几种排序的实现 数据结构中几种排序的实现