课程设计-多种排序方式

各种排序方式的使用

一、排序的简单介绍

排序算法的稳定性:稳定性是指能保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同。例如,a1、a2的值相等,排序前 a1在a2位置前,排序后a1还是在a2位置前,则算法稳定。

下面举例时,都按从小到大排序。

(1)直接插入排序  (Straight Insertion Sort)

时间复杂度 O(n^2)  空间复杂度 O(1)  稳定

将要排序的元素放入结构体数组tmp[0...n-1]中,排序过程中,数组被分为子区间tmp[0...i-1]和tmp[i...n-1],其中前一个子区间是有序区;后一个子区间是无序区,i每加1时,要求tmp[i]插入到tmp[0...i-1]中适当的位置上,tmp[0...i]变为有序区。

原始序列 4 7 3 9 6

第一步(4) (7 3 9 6)//第一个括号中序列为有序,第二个括号中无序

第二步(4 7) (3 9 6)//取无序区中第一个元素7,for循环有序区,查找合适的位置插入(此处可用二分查找优化)

第三步(3 4 7)(9 6)//取无序区中第一个元素3,for循环有序区,查找合适的位置插入

第四步(3 4 7 9)(6)//取无序区中第一个元素9,同上

第五步(3 4 6 7 9)排序完成

(2)希尔排序(Shell's Sort)

时间复杂度 O(nlog_{2}) 空间复杂度 O(1)  不稳定

先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序(一般d2=d1/2),直至所取的增量  =1(  <  …<d2<d1),即所有记录放在同一组中进行直接插入排序为止。

下列图片中:


(3)冒泡排序
时间复杂度 O(n^2) 空间复杂度 O(1) 稳定

在tmp[0...n]中,通过无序区相邻元素间的交换,使得无序区的最大元素下沉至有序区。第一次排序中无序区的最大元素到达位置tmp[n-1]的位置,下一次排序中,tmp[n-2]的位置上会填入tmp[0...n-2]中的最大元素,以此类推,知道i=n-1时程序截止。

原始序列 4 7 3 9 6
第一趟排序 4 3 7 6 9 //4比7小,故不交换位置。7比3大,则交换位置(4 3 7 9 6)。7比9小,故不交换位置。9比6大,则交换位置(4 3 7 6 9)。
第二趟排序 3 4 6 7 9 //4比3大,则交换位置(3 4 7 9 6)。4比7小,故不交换位置。7比6大,则交换位置(3 4 6 7 9)。
第三趟排序3 4 6 7 9 //3比4小,则交换位置。4比6小,则交换位置。
第四趟排序3 4 6 7 9  //3比4小,则交换位置。

第五趟排序3 4 6 7 9  //排序完成

(4)快速排序(Quick Sort)

时间复杂度 O(nlog_{2}) 空间复杂度 O(nlog_{2})  不稳定

排序开始时,将第一个元素作为关键字,大于关键字的数字放在关键字后,小于关键字的数字放在关键字前(无序),则关键字归位,这种算法是以递归的方式写出来的。每次在排列完当前长度数组的关键字后,分别排列他的左区间和右区间,直到每个子区间内只剩一个关键字为止。

有一点需要注意

例如 6 2 7 3 8 9

第一趟排序以后是3 2 7 6 8 9 并不是 2 3 6 7 8 9,这是由算法的代码决定的。在学习时,建议看着代码自己手动模拟一遍。可以看百度百科中的排列演示

(5)直接选择排序

时间复杂度 O(n^2) 空间复杂度 O(1)  不稳定

排序开始时,有数组tmp[0...n-1],其基本思想:第一次从R[0]~R[n-1]中选取最小值,与R[0]交换,第二次从R[1]~R[n-1]中选取最小值,与R[1]交换,....,第i次从R[i-1]~R[n-1]中选取最小值,与R[i-1]交换,.....,第n-1次从R[n-2]~R[n-1]中选取最小值,与R[n-2]交换, 总共通过n-1次,得到一个按排序码从小到大排列的有序序列·

下标

0

1

2

3

4

原始序列

4

7

3

9

6

第一趟排序

在待排序列式(4 7 3 9 6)中最小的是3,3与小标为0的元素交换,待排序列式(4 7 9 6)

下标

0

1

2

3

4

原始序列

3

7

4

9

6

第二趟排序

在待排序列式(4 7 9 6)中最小的是4,4与小标为1的元素交换,待排序列式(7 9 6)

下标

0

1

2

3

4

原始序列

3

4

7

9

6

 第三趟排序

在待排序列式(7 9 6)中最小的是6,6与小标为2的元素交换,待排序列式(9 7)

下标

0

1

2

3

4

原始序列

3

4

6

9

7

 第四趟排序

在待排序列式(9 7)中最小的是7,7与小标为3的元素交换,待排序列式(9)

下标

0

1

2

3

4

原始序列

3

4

6

7

9

 第五趟排序

排序完成

下标

0

1

2

3

4

原始序列

<
  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据结构课程设计是计算机科学与技术专业的核心课程之一,旨在培养学生分析和解决实际问题的能力。本教学计划的设计目标是使学生掌握数据结构的基本概念、常用算法和实际应用,提高其程序设计和问题解决能力。 本课程设计教学计划主要包括三个方面的内容:理论课程、实践课程和实验课程。 理论课程主要讲授数据结构的基本概念和理论知识,包括线性表、树、图等常用数据结构的表示和操作方法。同时,还介绍各种算法的设计思想和常见的问题解决方法,如排序、查找、图的遍历等。 实践课程是理论知识的实践运用,学生通过编写程序实现各种数据结构和算法,加深对数据结构的理解和掌握。同时,还要求学生完成一些实际问题的解决,如数据的统计分析、图像处理等,以提高学生的实际应用能力。 实验课程是对理论和实践的综合运用,学生在实验中通过设计和实现各种数据结构和算法,解决一系列实际问题。通过实验,学生能够加深对数据结构和算法的理解,加强对问题解决过程的思考和分析能力。 在教学过程中,我们将采用多种教学方法,如讲授、讨论、实践和实验等,以激发学生的学习兴趣和主动性。同时,还将引入一些教学资源,如课外阅读材料和在线学习平台,以便学生进一步拓宽知识面和提高自学能力。 总之,本教学计划旨在培养学生的数据结构思维和问题解决能力,使其能够在实际工作中灵活运用数据结构和算法解决问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值