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

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

a数组中的数据是这样的

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:

步骤2:

步骤3:

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

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(" ");

}

运行结果如下:

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

哎。。。。。。。。。

c语言入门 (共30篇) 上一篇:简单选择排序1 下一篇:地址

相关文章

  1. c语言入门:[26]结构体2

    上节我们自己创造了一个学生结构类型Student, Student stu1;其中 stu1就是一个学生结构类型变量,stu1里有5个成员分别是姓名.学号.数学成绩.语文成绩.英语成绩. 我们之前学习的基础数据类型例如int等可以定义数组,Student既然也是一个类型同样可以定义数组. Stude ...

  2. C语言入门基础

    这篇文章简单介绍C语言,以及其入门所需要学习的几个方面.以及一个最简单的入门让你程序. 方法/步骤 1.C语言,属于一种高级计算机语言,按语言分类的话,它区别于机器语言,以及汇编语言. 2.通俗的讲,C语言作为一门语言,他有自己的语法格式,自己的典故,以及特点.它的语法,包括数据的表示,语句,程序结 ...

  3. 如何学习C++以及相似的编程语言和编程提升

    C++是大家的难点也是大家的重点.对于编程语言的学习,大家心中都有一个疑问,就是有没有捷径?有,还是没有?我就讲一下我学习编程的体会.希望能够对大家很有帮助. 工具/原料 网页例如github,learncpp.com,cplusplus.com,cprogramming.com,onlinepro ...

  4. Java程序使用冒泡排序对数组进行调用排序

    Java语言是一门计算机的高级语言,被许多的IT行业的人们所应用着,随着时代的发展,学习计算机的人越来越多了,当然接触Java的人越来越多,对于简单的冒泡排序我可以给大家提供我的程序,用以帮助大家更好的学习JAVA语言. 工具/原料 计算机 Java程序学习者 方法/步骤 源程序为: public ...

  5. Excel2007筛选菜单入门使用教程

    日常工作中,excel数据筛选是非常常用的一项技能.通过数据筛选,我们可以快速得过滤掉不符合条件的信息,为后续的统计分析奠定基础.下面笔者就给大家简单地介绍一下数据筛选是如何使用的. 工具/原料 Microsoft Office Excel 2007 方法/步骤 打开工作表,比如我们有一张学生成绩表 ...

  6. fastreport c#入门教程之图表

    工具/原料 fastreport FastReport允许用户插入chart制表组件到报表中,这样,在FastReport面板上的"TfrxCharObject" 组件就必须应用上.这个组件基于"TeeChart"动态库,在delphi中需要将它包含在工程中. ...

  7. c语言入门:[30]指针初探

    指针简单的说就是存储内存地址的变量. 定义格式为: 数据类型 *指针变量名 例如 int *p;//p就是一个能够存储整型数据内存地址的指针变量 char *v;//v就是一个能够存储字符型数据内存地址的指针变量 请看下面的例子: #include<stdio.h> main() { i ...

  8. C语言排序算法:[3]教你理解简单选择排序.

    简单选择排序是经常用到的一种排序算法,它的原理是什么?如何实现,坐标X为您一一解答. 方法/步骤 一.简单选择排序一句话概括:每次选择无序数列中最小的将其放在有序数列的最后. 二.在简单选择排序中,我们用初始化的数字int a[6]={2,5,6,3,1,4} 三.算法基本执行步骤1:找到初始的无序 ...

  9. fastreport 入门教程之图表

    fastreport 入门教程之图表,FastReport允许用户插入chart制表组件到报表中,这样,在FastReport面板上的"TfrxCharObject" 组件就必须应用上.这个组件基于"TeeChart"动态库,在delphi中需要将它包含在工程 ...