排序概述
1、排序
排序就是将一组对象按照规定的次序重新排列的过程,排序往往是为检索服务的。
2、稳定性
n 个记录的序列为{R1,R2,…,Rn},其相应的键值序列为{k1, k2,…,kn},假设ki=kj,若在排序前的序列中 Ri 在 Rj 之前,即 i<j,经过排序后,Ri 仍在 Rj 之前,则称所用的排序方法是稳定的;反之,则称所用的排序方法是不稳定的。
(若待排序的序列中存在多个记录具有相同的键值,经过排序,这些记录的相对次序仍然保持不变,则称这种排序方法是稳定的。)
注意: 稳定性是排序方法本身的特性,与数据无关,换句话说,一种排序方法如果是稳定的,则对所有的数据序列都是稳定的,反过来,如果在一组数据上出现不稳定的现象,则该方法是不稳定的。
3、分类
内部排序(Internal Sorting):待排序的记录全部存放在计算机内存中进行的排序过程;
外部排序(External Sorting):待排序的记录数量很大,内存不能存储全部记录, 需要对外存进行访问的排序过程。
直接选择排序
1、基本思想
在第 i 次选择操作中,通过 n-i 次键值间比较,从 n-i+1 个记录中选出键值最小的记录,并和第 i (1≤i≤n-1) 个记录交换。
2、算法
【202008考试真题】对初始关键字序列 45, 38, 66, 90, 88, 10, 25, 采用直接选择排序,给出排序过程和结果。
void SelectSort (List R, int n) {
int min,i,j;
for(i=1;i<=n-1;i++) { //每次循环,选择出一个最小键值
min=i;
//假设第 i 个记录键值最小
for (j=i+1;j<=n;j++) {
if (R[j].key<R[min].key) min=j; //记录下键值较小记录的下标
}
if (min!=i) swap(R[min],R[i]); //将最小键值记录和交换第 i 个记录交换
}
}
3、图解动态演示
4、时间复杂度、稳定性
算法的主要部分包含两层嵌套的 for 循环,其时间复杂度为 O(n^2)。直接选择排序算法简单,容易实现,但不适宜于 n 较大的情况。
直接选择排序是不稳定的