选择排序法(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("%dn",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趟,但是他的方式是抓住一个位置(关注点是位置)上的元素不放,然后与其他余下待比较的全部进行比较,交换的话也是换到前面所说的那个固定位置上来的,直至一趟比较完成,决出一个。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>