选择排序法(C语言)

选择排序法思路

借此例子,说一下我对选择排序法的理解,还请耐心看完

a[0]=45,a[1]=67,a[2]=87,a[3]=34,a[4]=89

       首先,选定第一个,也就是a[0],作为本轮的主要对象,将a[0]和后面的四项都依次比较,每次比较,如果有比a[0]大的,就将a[0]的值更新一下,走完一轮下来,a[0]的值就固定下来了,作为最大值(这里我写的是大的放在最前面,也可以把最小的放最前面)

       而后,不再管a[0],再从a[1]开始,重复上述做法。

      大循环一共四轮,因为每次比较都固定一位,固定了四位后,最后一位就自然也不用再比较了,(一共五个数),所以,程序第七行,我们设置的for循环时,设置循环进行四次。

       内层循环第一次是从a[1]开始比较,然后依次是a[2]、a[3]....,内循环每走完一轮,我们就要舍弃掉最前面的一个元素,因此在设置内循环每次的初始值时,引入了i这个变量。

解释完了思路,我们再来过一遍流程

第一次,a[0]和a[1]、a[2]、a[3]、a[4]比较,定下了a[0],放的是最大值

第二次,a[1]和a[2]、a[3]、a[4]比较,定下了a[1],放的是次大值

第三次,a[2]和a[3]、a[4]比较,定下了a[2],放的是第三大的值

第四次,a[3]和a[4]比较,定下了a[3],放的是第四大的值

至此,余下a[4]中的自然是最小值

一般化的程序

#include<stdio.h>
#define N 10  //此处可以自定义N,按需求改变数组的大小
int main()
{
    int a[N]={0};
    int i,j,temp=0;
    printf("请输入要比较的值:");
    for(i=0;i<N;i++)           //遍历数组给入值
    {
        scanf("%d",&a[i]);
    }
    for(i=0;i<N-1;i++)        
    {
        for(j=i+1;j<N;j++)
        {
            if(a[i]>a[j])
            {
                temp=a[i];     //常规的比较交换,用到一个中间变量,存值
                a[i]=a[j];
                a[j]=temp;
            }
        }
    }
    for(i=0;i<N;i++)        //遍历数组输出
    {
        printf("%d\n",a[i]);
    }
    return 0;
}

按照模块化编程的思想,我封装了一下这个选择排序算法的函数

void selectSort(int array[] , int size)
{
	int i,j,min,temp;
	//需要的主循环趟数比实际的数据个数少1
	for(i = 0; i < size - 1;i++)
	{
		min = i;
		for(j = i + 1; j < size; j++ )
		{
			if(array[j] < array[min])
			{
				min = j;
			}
		}
		if(min != i)
		{
			temp = array[min];
			array[min] = array[i];
			array[i] = temp;
		}
	}
}

我的上一篇博文,对冒泡排序法做了解读, 初学者可能会将冒泡法和选择法两个排序算法搞混淆,下面我就此来发表一下我的见解

关于冒泡法,他的主循环是走N-1(N是总个数)趟,每一趟进行连续的前后前后往复的比较,然后每次决出一个。

而选择法,他的主循环同样也是走N-1趟,但是他的方式是抓住一个位置(关注点是位置)上的元素不放,然后与其他余下待比较的全部进行比较,交换的话也是换到前面所说的那个固定位置上来的,直至一趟比较完成,决出一个。

  • 123
    点赞
  • 484
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 20
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

翔在天上飞

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值