简单选择排序

  冒泡排序第 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

 

 

参考书籍:程杰 著,《大话数据结构》,清华大学出版社。

posted @ 2020-10-22 16:37  封狼居胥!  阅读(182)  评论(0编辑  收藏  举报