简单选择排序
冒泡排序第 i 次循环(外层 for 循环)可以确定顺序表中第 i 个位置的记录;同样的,简单选择排序也可以在第 i 次循环(外层 for 循环)确定顺序表中第 i 个位置的记录。不同之处在于,在每次循环中,冒泡排序在不断的进行记录之间的交换,而简单选择排序最多只进行一次记录之间的交换。相比之下,简单选择排序可以有效减少数据之间的交换次数。
简单选择排序的基本思想:在第 i 次外循环中,进行(n - i)次关键字的比较,选取(n - i +1)个记录中关键字最小的记录,将其作为有序序列的第 i 个记录。
以顺序表L = {9,1,5,8,3}为例,length = 5。代码如下所示:
1 //简单选择排序
2 void SelectSort(SqList* L)
3 {
4 int i, j, min;
5
6 //第i次循环,在(n-i+1)个记录中选取关键字最小的记录作为有序序列的第i个记录
7 //第i次循环可以确定第i个位置上的记录
8 //只需要循环(length-1)次,最后一次(i=length时)只剩下一个元素,一定为最大值
9 for (i = 1; i < L->length; i++)
10 {
11 min = i;//将最小值的下标min定义为当前下标i
12
13 //从(n-i+1)个记录中选出关键字最小的记录,将其下标赋值给min
14 for (j = i + 1; j <= L->length; j++)
15 {
16 if (L->r[min] > L->r[j])
17 min = j;
18 }
19
20 //执行完下面if后
21 //有序序列的第i个记录为(n-i+1)个记录中关键字最小的记录
22 if (i != min)//若不成立,说明r[i]即为最小值
23 swap(L, i, min);
24 }
25 }
顺序表中的记录变化如下所示:
相关链接:
冒泡排序 https://www.cnblogs.com/yongjin-hou/p/13858510.html
直接插入排序 https://www.cnblogs.com/yongjin-hou/p/13861458.html
希尔排序 https://www.cnblogs.com/yongjin-hou/p/13866344.html
堆排序 https://www.cnblogs.com/yongjin-hou/p/13873770.html
归并排序 https://www.cnblogs.com/yongjin-hou/p/13921147.html
快速排序 https://www.cnblogs.com/yongjin-hou/p/13950379.html
参考书籍:程杰 著,《大话数据结构》,清华大学出版社。