简单选择排序

会有一股神秘感。 提交于 2019-11-27 03:45:55

简单选择排序:

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

简单选择排序示例:

初始
关键字
第一趟
排序后
第二趟
排序后
第三趟
排序后
第四趟
排序后
第五趟
排序后
第六趟
排序后
第七趟
排序后
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个记录交换
		}
		Print(L);
	}
}

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. 在比较过程中没有记录比较的中间结果,所以比较的次数就很多。能否记录排序过程中的比较结果,提高效率?
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!