数据结构(C语言版) 简单选择排序

本文介绍了简单选择排序的方法,通过在待排序的数据中选择最小值放到最前面进行排序。详细阐述了C语言实现简单选择排序的过程,并分析了其时间复杂度为O(n^2),空间复杂度为O(1),是一种不稳定的排序算法。适用范围包括n较小的情况和选取前k个最小值的场景。同时提出了改进思考,探讨如何通过记录比较结果和采用链表存储结构来提高效率。
摘要由CSDN通过智能技术生成

简单选择排序:

排序方法:在待排序的数据中选择最小值放到最前面

简单选择排序示例:
初始
关键字
第一趟
排序后
第二趟
排序后
第三趟
排序后
第四趟
排序后
第五趟
排序后
第六趟
排序后
第七趟
排序后
4913131313131313
3838272727272727
6565653838383838
9797979749494949
7676767676494949
1349494997976565
2727386565659776
4949494949767697

代码实现:

说明:本博客的代码实现贴近数据结构(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;
}

在这里插入图片描述
在这里插入图片描述

算法分析
  1. 时间复杂度分析T(n)=O(n2)
  2. 空间复杂度分析S(n)=O(1)
  3. 稳定性:不稳定的
适用范围
  1. n较小时
  2. 在n个待排序的数据中选取前k(k<<n)个最小值
改进思考
  1. 能否以链表为存储结构,实现该算法?
  2. 在比较过程中没有记录比较的中间结果,所以比较的次数就很多。能否记录排序过程中的比较结果,提高效率?
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值