c语言入门:[28]简单选择排序2

2025-10-20 04:59:19

 先回顾下上节简单选择排序1中的程序

c语言入门:[28]简单选择排序2

a数组中的数据是这样的

c语言入门:[28]简单选择排序2

max变量中存储的最大数为89,no中存储的数组下标为3

既然我们找到了数组中的最大数和它的下标位置,要想让这个数组中的数据按照从大到小的顺序排序,是不是我们首先应该把这个最大数放在数组的第一个位置即a[0]里呢。

我们直接这样做是不行的

a[0]=max;

这样做就把原来数组里a[0]的数据34给弄丢了。

现在我们知道的是数组里a[3]是最大的整数,a[3]里的数据应该存放到a[0]里,那原来a[0]里的数据放在哪呢?既然一个萝卜一个坑,我们完全可以把两个萝卜换一下位置,就是把a[3]和a[0]里的数据换一下位置,这样我们既没有丢失数据又实现了把最大数存放到了数组的第一个位置。

你要把一瓶雪碧和一瓶可乐里的液体互换你得准备一个空瓶子,一样道理要想互换a[0]和a[3]里的数据,我们得定义一个变量int t; t用来临时存储数据。请看下面的示意图:

步骤1:

c语言入门:[28]简单选择排序2

步骤2:

c语言入门:[28]简单选择排序2

步骤3:

c语言入门:[28]简单选择排序2

以上三个步骤对应的代码为:

t=a[0];

a[0]=a[3];

a[3]=t;

 

现在我们总结下把a数组里的最大值放到a[0]里的代码

no=0;//我们先认为a[0]为最大数,no用来存储最大数在数组中的下标位置,这里我们取消了上节中定义的max变量,因为既然知道最大数的下标,那a[no]就是最大数

for(i=1;i<10;i++)//循环访问数组中的后9个元素

{

     if(a[i]>a[no])//如果a[i]比最大数大

     {

         no=i;//此时a[i]应为最大数记录最大数在数组中的下标位置

     }

}

//经过上面的循环后,no里已经存储了数组中最大元素的下标,下面三行是把a[0]与a[no]互换

t=a[0];

a[0]=a[no];

a[no]=t;

有人可能会问,如果循环后数组里后9个元素都没有a[0]大那你不还是把a[0]与a[no]互换了吗?没关系如果是这种情况的话no里的值还是0,那我们就是把a[0]跟a[0]里的数据互换,a[0]里的值还是没变。

 

经过以上的过程a[0]里已经肯定存储了数组中的最大值,接下来就是在后9个元素中找倒数第二大的了。

no=1;//先认为a[1]为倒数第二大数

for(i=2;i<10;i++)//循环访问数组中的后8个元素

{

     if(a[i]>a[no])

     {

         no=i;

     }

}

//找到倒数第二大数a[no]后接下来把a[1]与a[no]互换

t=a[1];

a[1]=a[no];

a[no]=t;

 

你发现规律了吗,如果还没发现,请看我下面罗列的代码。

找倒数第三大的数:

no=2;

for(i=3;i<10;i++)

{

     if(a[i]>a[no])

     {

         no=i;

     }

}

t=a[2];

a[2]=a[no];

a[no]=t;

找倒数第四大的数:

no=3;

for(i=4;i<10;i++)

{

     if(a[i]>a[no])

     {

         no=i;

     }

}

t=a[3];

a[3]=a[no];

a[no]=t;

找倒数第五大的数:

no=4;

for(i=5;i<10;i++)

{

     if(a[i]>a[no])

     {

         no=i;

     }

}

t=a[4];

a[4]=a[no];

a[no]=t;

................................

发现规律没,是不是我们在重复执行一段代码,只是一些数字在变化,而这些数字还是有规律的,这不就能用循环来解决吗,现在我们想下这段代码我们要重复执行几次?10个数的话我们重复执行9次就可以了,找出倒数第9大的数存放到a[8]里后,那a[9]里肯定是最小的了就不用再找了。

int j;//定义一个变量用来控制循环,重复执行我们那段代码

for(j=0;j<9;j++)

{

     代码段;

}

接下来我们就是研究代码段中一些变化的数值该怎么处理了。

现在看我们代码段中的第一行

找最大数时是no=0;

找倒数第二大数时是no=1;

找倒数第三大数时是no=2;

找倒数第四大数时是no=3;

...............

不正好跟循环中的j的每次取值是对应的吗,那我们就可以把代码段中的第一行换成no=j;

现在看我们代码段中的第二行

找最大数时是for(i=1;i<10;i++)

找倒数第二大数时是for(i=2;i<10;i++)

找倒数第三大数时是for(i=3;i<10;i++)

找倒数第四大数时是for(i=4;i<10;i++)

...............

正好是循环中j的每次取值+1,那我们就可以把代码段中的第一行换成for(i=j+1;i<10;i++)

现在看我们代码段中的最后三行

同样道理可以换成

t=a[j];

a[j]=a[no];

a[no]=t;

 

好了最后整理出代码如下:

#include "stdio.h"

int main()

{

int a[10]={34,56,7,89,9,9,56,34,78,65};

int no;

int t;

int i;

int j;

for(j=0;j<9;j++) //控制循环9次

{

//---------------重复执行的代码段

   no=j;

  for(i=j+1;i<10;i++)

  {

     if(a[i]>a[no])

     {

        no=i;

     }

  }

  t=a[j];

  a[j]=a[no];

  a[no]=t;

//-----------------

}

 

//输出数组里的元素

for(i=0;i<10;i++)

{

   printf("%d ",a[i]);

}

printf(" ");

 

}

运行结果如下:

c语言入门:[28]简单选择排序2

10个元素的排序我们至此就完成了,采用的方法是简单选择排序。

哎。。。。。。。。。

 

(共篇)上一篇:switch语句|下一篇:
声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢