C语言实现选择排序-带详细解释

二进制 (BinaryLife)
• 阅读 2169

环境:

ide clion;win10

先代码

#include <stdio.h>

/**
 设置一个嵌套循环
第一层循环为前九个(假设数组共6个元素),并在每次循环时将对应当前次数的数组元素设置为(假设为)最大值。

在第二层循环中,循环比较该元素之后的每个数组元素,并将每次比较结果中较大的数设置为最大值。

在第二层循环结束时,将最大值与开始时设置的最大值(假设的)数组元素进行互换。

当所有循环都完成以后,就将数组元素按照从大到小的顺序重新排列了
 * @return
 */
int main() {

    int i, j;
    int a[6] = {6, 3, 8, 2, 9, 1};
    int itemp;//假定的最大值,一般为默认第一个数
    int iPos;
    for (int i = 0; i < 5; i++) {
        itemp = a[i];//假定当前循环内最大值为当前第一个元素
        iPos = i;//假定当前最大值的下标
        for (int j = i + 1; j < 6; j++) {
            printf("内循环内第%d次比较,用数字 %d与第%d个数%d比较\n", j, itemp, j, a[j]);
            if (a[j] > itemp) {
                printf("%d比%d假设的itemp大,交换\n", a[j], itemp);
                itemp = a[j];
                iPos = j;
                printf("现在的假定最大的值为%d,他在数组内的下标为%d\n", itemp, j);
            }
        }
        printf("内循环内第%d次结束\n", i + 1);
        printf("现在a[i]的值为%d,itemp的值为%d,a[ipos]的值为%d\n", a[i], itemp, a[iPos]);
        a[iPos] = a[i];//把原来认为最大的值的下标i与i+1次后实际的最大得值的下标ipos交换
        a[i] = itemp;//把最大的值放在i+1次排序后的第一个位置。仍然假设当前为为最大值,但是此次已经证明了i+1次
        printf("外循环内第%d次结束\n\n", i);
    }

    for (int i = 0; i < 6; i++) {
        printf("%d\t", a[i]);

        if (i == 2) {
            printf("\n");
        }
    }


    return 0;
}

控制台输出解释

C:UsersvolvoCLionProjectsuntitledcmake-build-debuguntitled.exe
内循环内第1次比较,用数字 6与第1个数3比较
内循环内第2次比较,用数字 6与第2个数8比较
8比6假设的itemp大,交换
现在的假定最大的值为8,他在数组内的下标为2
内循环内第3次比较,用数字 8与第3个数2比较
内循环内第4次比较,用数字 8与第4个数9比较
9比8假设的itemp大,交换
现在的假定最大的值为9,他在数组内的下标为4
内循环内第5次比较,用数字 9与第5个数1比较
内循环内第1次结束
现在a[i]的值为6,itemp的值为9,a[ipos]的值为9
外循环内第0次结束

内循环内第2次比较,用数字 3与第2个数8比较
8比3假设的itemp大,交换
现在的假定最大的值为8,他在数组内的下标为2
内循环内第3次比较,用数字 8与第3个数2比较
内循环内第4次比较,用数字 8与第4个数6比较
内循环内第5次比较,用数字 8与第5个数1比较
内循环内第2次结束
现在a[i]的值为3,itemp的值为8,a[ipos]的值为8
外循环内第1次结束

内循环内第3次比较,用数字 3与第3个数2比较
内循环内第4次比较,用数字 3与第4个数6比较
6比3假设的itemp大,交换
现在的假定最大的值为6,他在数组内的下标为4
内循环内第5次比较,用数字 6与第5个数1比较
内循环内第3次结束
现在a[i]的值为3,itemp的值为6,a[ipos]的值为6
外循环内第2次结束

内循环内第4次比较,用数字 2与第4个数3比较
3比2假设的itemp大,交换
现在的假定最大的值为3,他在数组内的下标为4
内循环内第5次比较,用数字 3与第5个数1比较
内循环内第4次结束
现在a[i]的值为2,itemp的值为3,a[ipos]的值为3
外循环内第3次结束

内循环内第5次比较,用数字 2与第5个数1比较
内循环内第5次结束
现在a[i]的值为2,itemp的值为2,a[ipos]的值为2
外循环内第4次结束

9 8 6
3 2 1
Process finished with exit code 0

点赞
收藏
评论区
推荐文章
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
似梦清欢 似梦清欢
3年前
排序算法(简单选择、堆排序、归并)
简单选择排序:::tip简单选择排序原理:将未排序的数组中从前向后遍历,找到最小的元素和数组中第一个元素交换位置,此时数组中第一个元素位置已经确定,再将未排序的数组中从前向后遍历,找到最小的元素和数组中第二个元素交换位置,依次向下。:::需要两层循环,外层
Wesley13 Wesley13
4年前
java 基础知识
遍历遍历就是把这个数组的每个元素显示出来遍历的方法就是先定义这个数组的大小,然后用FOR循环来完成数组,例如doublescorenewdouble5;ScannerinputnewScanner(System.in);for(inti0;i<score.l
Stella981 Stella981
4年前
Python+Selenium自动化篇
本篇文字主要学习selenium定位页面元素的集中方法,以百度首页为例子。0.元素定位方法主要有:id定位:find\_element\_by\_id('')name定位:find\_element\_by\_name('')class定位:find\_element\_by\_class\_name(''
Stella981 Stella981
4年前
Egret性能优化(代码篇)
代码注意事项:类方法中,将this赋值给另外一个临时变量,如self,再用self进行提高1/3的效率。在循环中,尝试改进写法,减少读取次数:for(vari0,lengtharray.length;i<length;i)。避免双重解释,如eval函数,会使JavaS
Wesley13 Wesley13
4年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
4年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
4年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
小万哥 小万哥
1年前
Kotlin 控制流和数组操作详解
Kotlin的when表达式提供了一种比if..else更清晰的方式来选择执行多个代码块之一,类似于Java的switch语句但更为强大和灵活。while循环允许在条件为真时重复执行代码块,而do..while循环则保证至少执行一次。break和continue可用于控制循环流程:前者终止循环,后者跳过当前迭代。数组则用于存储多个值,可以创建、访问、修改数组元素及遍历整个数组。这些构造使得编写简洁且高效的代码成为可能。