简单选择排序:
排序方法:在待排序的数据中选择最小值放到最前面
简单选择排序示例:
初始 关键字 | 第一趟 排序后 | 第二趟 排序后 | 第三趟 排序后 | 第四趟 排序后 | 第五趟 排序后 | 第六趟 排序后 | 第七趟 排序后 |
---|---|---|---|---|---|---|---|
49 | 13 | 13 | 13 | 13 | 13 | 13 | 13 |
38 | 38 | 27 | 27 | 27 | 27 | 27 | 27 |
65 | 65 | 65 | 38 | 38 | 38 | 38 | 38 |
97 | 97 | 97 | 97 | 49 | 49 | 49 | 49 |
76 | 76 | 76 | 76 | 76 | 49 | 49 | 49 |
13 | 49 | 49 | 49 | 97 | 97 | 65 | 65 |
27 | 27 | 38 | 65 | 65 | 65 | 97 | 76 |
49 | 49 | 49 | 49 | 49 | 76 | 76 | 97 |
代码实现:
说明:本博客的代码实现贴近数据结构(C语言版) 课本代码风格,使用抽象数据类型。
项目结构
以下文件代码与直接插入排序时所用相同,为避免大量代码重复此处不再附上。
详情可参考直接插入排序:https://blog.csdn.net/ZipayYu/article/details/98245056
status.h
ststus.cpp
SequenceListType.h
SequenceListType.cpp
简单选择排序的实现
/************************************
* 函数名称: SelectMinKey
* 函数说明: 在L.r[start]~L.r[L.length]中选择key最小的记录
* 编写人员: Zipay Yu
* 编写日期: 2019/08/12
* 返回类型: int
* 函数参数: SqList & L
* 函数参数: int start 开始位置
*************************************/
int SelectMinKey(SqList & L, int start)
{
int i,j;
j = start;
for (i = start+1; i <= L.length; ++i) {
if (L.r[j].key > L.r[i].key) {
j = i;
}
}
return j;
}
/************************************
* 函数名称: SelectSort
* 函数说明: 对顺序表L作简单选择排序
* 编写人员: Zipay Yu
* 编写日期: 2019/08/12
* 返回类型: void
* 函数参数: SqList & L
*************************************/
void SelectSort(SqList &L) {
int i,j;
for (i=1;i<L.length;++i) //选择第i小的记录,并交换到位
{
j = SelectMinKey(L, i); //在L.r[i]~L.r[L.length]中选择key最小的记录
if (i!=j){
Swap(L, i, j); //与第i个记录交换
}
}
}
data.txt
第一个数表示顺序表数据个数,后面的数据为实际的待排序数据
8 49 38 65 97 76 13 27 49
测试
int main() {
SqList L;
printf("排序前数据:");
CreateSortList(L); //初始化数据
Print(L); //输出初始数据
SelectSort(L); //执行排序
printf("排序后数据:");
Print(L); //输出排序后数据
system("pause");
return 0;
}
算法分析
- 时间复杂度分析T(n)=O(n2)
- 空间复杂度分析S(n)=O(1)
- 稳定性:不稳定的
适用范围
- n较小时
- 在n个待排序的数据中选取前k(k<<n)个最小值
改进思考
- 能否以链表为存储结构,实现该算法?
- 在比较过程中没有记录比较的中间结果,所以比较的次数就很多。能否记录排序过程中的比较结果,提高效率?