目前正在学习自考资料《数据结构》米老师说,现在这个阶段,最重要的就是总结归纳,编织自己的知识网!虽然当时理解了懂了,但还是架不住时间的侵蚀,所以,总结归纳是让所学知识融入自身认知结构的重要组成部分,使自己的认知在“平衡-不平衡-新的平衡”的循环中不断丰富、提高和发展。
定义
排序就是将一组对象,按照规定的次序,进行重新排列的过程。它主要为检索服务!
分类
排序可分为两大类:内部和外部
内部:待排序的记录全部存放在计算机内存中,然后进行排序的过程。
外部:待排序的记录数量很大,内存不能存储全部记录,需要对外存进行访问的排序过程。
在内部排序中可分为四类:插入、交换、选择和归并。下面一一为大家介绍一下:
插入
插入排序又可分为多种方法,本篇博客中只介绍直接插入排序(Straight Insertion Sorting)
的基本思想是,依次将每个记录插入到一个已排好序的有序表中去,从而得到一个新的、记录数增加1的有序表。
在直接插入排序算法的描述中,我们会设置“岗哨”。那么,这里的“岗哨”是什么意思?
上面的代码中,List型变量的第0个记录可以闲置或用来暂存某个记录值,可以用作“岗哨”。所以,使用R[0]有两个作用。
1、 进入查找循环之前,保存R[i]的值,使得不至于因记录的后移而丢失R[i]中的内容
2、 起到岗哨作用,在while循环中“监视”数组下标变量j是否越界,一旦越界(j<1),R[0]自动控制while循环的结束,从而避免了while循环中每一次都要检测j是否越界。这一技巧的使用,使得测试循环条件的时间减少一半左右。
交换
基本思想:比较两个记录键值的大小,如果这两个键值的大小出现逆序,则交换这两个记录。这样一来,键值较小的记录向序列前部移动,大的向后移动。。
交换排序中,主要有两种方法:冒泡排序法和快速排序法。
冒泡步骤:
1、 将第一和第二个记录的键值比较,若为逆序,则将两个记录交换
2、 继续比较第二和第三个记录的键值
3、 一次类推,直到完成第n-1和第n个记录的键值比较交换为止
从上图中可以看出,键值较小的记录好比起泡一样向上漂浮,键值较大的则向下沉,所以,称为冒泡排序。
快速排序
基本思想:
1、 在N个记录中取第一个记录键值为基准(通常)
2、 通过第一趟排序,将待排序记录分为两个独立部分:<=键值、>键值。
3、 以二叉树先序遍历的形式,对两部分记录分别排序,最后达到整个序列有序的效果。
通过上面的图,我们可以看出:
1、 它是以第一个记录的键值45为基准
2、 从第n个记录向前,找到第一个小于45的键值,然后互换位置
3、 从第2个记录向后,找到第一个大于45的键值,然后互换位置
4、 按照前两部的顺序进行循环
选择
基本思想:每一次在n-i+1(i=1,2,~~~,n-1)个记录中选取键值最小的记录作为有序序列的第i个记录。
在选择排序中,主要有两种方法:直接选择排序和堆排序。
直接选择
基本思想:在第i次操作中,通过n-i次键值的比较,从n-i+1个记录中选出键值最小的记录。
堆排序
基本思想:在输出堆顶的最小键值之后,使得剩余的n-1个键值重新建成一个堆,则可得到n个键值中的次最小值。如此反复执行,便能得到有序序列,称之为堆序列。
最小堆:若有一个关键字{K1,K2,~~~,Kn}满足Ki<=K2i,Ki<=K2i+1,并且,i=1,2,~~~,n/2,则称这个n个键值的序列为最小堆。
堆排序实现要解决两个问题:
1、 如何将初始序列建成堆
2、 如何在输出堆顶元素之后调整剩余元素成为一个新堆
第一个问题解决方法
1、 将要排序的键值看成一棵完全二叉树的结点
2、 根据完全二叉树性质最后一个非终结点是第n/2个元素,所以,筛选只需从第n/2个元素开始至以前的元素结束。
由上图所示,n为10,n/2为5,所以从72开始执行,到45结束。
第二个问题解决方法
1、 设最后一个叶结点为新的根
2、 新根与左右子树的根节点进行比较,选出最小值,确定新根节点元素的方向(左子树 or 右子树)
3、 将最小值放在堆顶,其他值进行调整
4、 重复循环
归并排序(Merge Sorting)
基本思想
与前三种排序的不同之处是,要求待排序列是由若干个有序子序列组成。归并排序的核心操作是将两个或以上的有序表合并成一个新的有序表。
二路归并
1、 将每相邻的两个记录合并,使每个子序列包含两个记录。
2、 再将上述子序列两两合并
3、 如此反复,直至得到一个长度为n的有序序列为止,排序结束
稳定性
定义:
相同键值的两个记录在排序前后,是否发生相对位置的改变,称为排序算法的稳定性。
稳定性是排序算法本身的特性,与数据无关。就是说,一种排序方法如果是稳定的,则对所有的数据序列都是稳定的。
那么咱们上面所写到的方法的稳定性如何呢?
适用范围
评价一个排序算法的优劣,通常用时间和空间复杂度这两个指标。这里主要写时间复杂度。
我们会从键值的比较次数和记录的移动次数两个方面来分析时间复杂度。
当待排序序列已基本有序时,插入和交换排序比较有效;当待排记录数量较大时,选择排序比较有效。各种方法都有自己适合的不同情况,在实际应用中应该选择适当的方法。
比较
入排序:将记录分为有序和无序区,让无序区中的记录依次插入到有序区中,并保持有序。
交换排序:两两比较待排序记录,当记录之间键值出现逆序时,则互换位置。
选择排序:每次从待排序记录中选取键值最小或最大的记录放在适当的位置。
归并排序:将两个或两个以上的有序表合并成一个有序
总结
通过对排序的学习,让我深刻认识到它的重要性,它提高了计算机的运行效率,大大减少了人们检索的时间。最后,鼓励自己一下,
I believe in myself , i’m the best and ideserve the best ! Now , stand firm and tall , make a fist , get excited andyell it out :
I must do it ! I can do it ! I will do it ! I will succeed !!!