数据结构学习(十四)——选择排序

前篇的插入排序算法,为了给插入元素空出位置,经常要后移腾出位置而进行大量后移操作,如果是移动数据元素规模大的话,就会耗时降低效率。

插入排序操作特点:先确定排序对象,再确定插入位置。

选择排序操作特点:先确定排序位置,再确定排序对象。

选择排序大概流程就是从第一个元素开始,然后与后面的元素依次比较大小,比当前元素小的话就记下当前最小位置,继续比较,直到这轮比较完毕,这样就可以找出这一轮最小的元素,然后把此最小元素放入第一个元素位置。然后从第二个元素开始,继续上面的操作。最后就能排好序。

下面的代码实现了选择排序的操作练习。

#include <stdio.h>

#define MAXSIZE 50

void Select_sort(int *s, int n);

int main(void)
{
	int n, i;
	int s[MAXSIZE + 1];

	printf("选择排序练习:\n");
	printf("输入想输入数据的个数:");
	scanf("%d", &n);
	getchar();
	printf("依次输入想输入的数据\n");
	for(i=1; i<=n; i++)
	{
		scanf("%d", &s[i]);
	}

	Select_sort(s, n);

	printf("排序后的数据为:\n");
	for(i=1; i<=n; i++)
	{
		printf("%d ",s[i]);
	}
	printf("\n");

	return 0;
}

void Select_sort(int *s, int n)
{
	int i, j, k;

	for(i=1; i<=n; i++)
	{
		k = i;					//假定当前元素为最小值
		for(j=i+1; j<=n; j++)	
		{
			if(s[j] < s[k])
			{
				k = j;			//记录当前最小值的下标
			}
		}
		if(k != i)				//把真正最小元素值放入正确位置
		{
			s[0] = s[k];
			s[k] = s[i];
			s[i] = s[0];
		}
	}
}

选择排序的时间复杂度也跟数据多少成正比例,所以时间复杂度为O(n^2)

该算法主要两部分组成,一种是比较操作,一种是交换操作,进行一次交换操作相当于进行三次移动操作。但工作量还是比一次比较操作工作量小。该算法主要工作量为内层循环的比较操作。

选择排序也只需要一个备用单元,即数组下标为0的元素和3个辅助变量i,j,k。

选择排序不同于插入排序,只能用于静态排序。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值