[c语言]总结选择排序的一些细节

[c语言]总结选择排序的一些细节

1.求解前需知

对于一组乱序的数字,c语言的通常解决方法有两种,冒泡排序和选择排序。本文介绍选择排序。

(冒泡排序在上篇文章中,需要的点击这里:[c语言]总结冒泡排序的一些细节

2.选择排序

①名词解释:

顾名思义,选择排序就是在一组含有n个无序的数字中选择出来一个最小值与第一个元素进行交换,所以要交换n-1个回合(因为倒数第二个数字选择结束后,最后一个数字,也就是最大数就到了最后一位。)外循环控制总选择回合。

每一回合进行选择时,其实都是第一个数字与后面每个数字进行比较,根据c语言数组的定义,数组下标不可越界。举一个例子:

6个数字组成的数组a[6],数组下标的范围是从a[0]到a[5],那么我们固定第一个数字a[0],让它与剩下的a[1]到a[5]进行比较,就要比较5回合,因为是从a[1]开始的,所以内循环的循环变量j正好小于6(也是小于等于5),即为数字的个数。理论存在,代码走起。

for(i=0;i<n-1;i++)
{
    p = i;
    for(j=i+1;j<n;j++)
    {
        if(a[j]<a[p])
        {
            temp=a[j];
            a[j]=a[p];
            a[p]=temp;
        }
    }
}
②代码解释:

p=i,是将每一回合的第一个数赋值给p(也就是假想p为最小值),这样方便每一次循环比较。

若要将所以数中的最大数放到前面,形成倒序排的话,只需要将上述代码中的**a[j]<a[p]改成a[j]>a[p]**即可。

③动态图演示

选择排序动态图(土豆哥666制作)

3.选择排序分析

选择排序中,最理想的状况就是移动次数为0次,原来就是一组有序数,最复杂的情况就是一组倒序数,最小的数字在最后面,最多要移动3(n-1)次,6个数字就要移动30次。时间复杂度为O(n²)。

4.完整代码

#include<stdio.h>
int main()
{
  int i,j,temp,a[666],n,p;
  printf("输入需要排序的个数:\n");
  scanf("%d",&n);
  printf("输入需排序的%d个数字\n",n);
  for(i=0;i<n;i++)
	  scanf("%d/t",&a[i]);
  printf("`````````````````````````\n");
  printf("显示未排序数字:\n");
  for(i=0;i<n;i++)
	  printf("%4d",a[i]);
  printf("\n");
	for (i = 0; i < n-1; i++)//确定总选择回合
	{
		p = i;
		for (j = i+1; j < n; j++)//每回合选择次数
		{

			if (a[j]<a[p])
			{
				//交换
				temp = a[j];
				a[j] = a[p];
				a[p] = temp;
			}
		}
	}
	printf("显示排序完成后的数字:\n");
	for(i=0;i<n;i++)
		printf("%4d",a[i]);
	printf("\n");
    return 0;
}

程序结果

如果看到这里感觉有帮助的话,请给土豆哥点个赞哦,嘻嘻!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

土豆哥666

感谢你的支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值