选择法排序

从小到大的选择排序 是从一个数组中依次选出 最小数值 输出,第二小的数值输出,第三小的数值输出…
…直到最后一个数组中最后一个数遍历完成,则 整个排序输出完成。

 

选择法排序指每次选择所要排序的数组中的最大值(由小到大排序则选择最小值)的数组元素,将这个数组元素的值与最前面没有进行排序的数组元素的值互换。以数字9、6、15、4、2为例,采用选择法实现数字按从小到大进行排序,每次交换的顺序如图8.17所示。

 图片 1

图8.17 
选择法排序示意图

从图8.17可以发现,在第一次排序过程中将第一个数字和最小的数字进行了位置互换;而第二次排序过程中,将第二个数字和剩下的数字中最小的数字进行了位置互换;依此类推,每次都将下一个数字和剩余的数字中最小的数字进行位置互换,直到将一组数字按从小到大排序。

下面通过实例来看一下如何通过程序使用选择法实现数组元素从小到大的排序。 

01奇数求和练习

  • A: 奇数求和练习

    • a: 题目分析

      • 为了记录累加和的值,我们需要定义一个存储累加和的变量
      • 我们要获取到1-100范围内的数
      • 判断当前数是否为奇数,是奇数,完成累加和操作
      • 累加完毕后,最终显示下累加和的值
    • b: 解题步骤

      • 定义一个用来记录累加和的变量
      • 使用for循环语句,Markdown Preview Enhanced: Toggle Scroll
        Sync完成1-100之间每个数的获取
      • 使用if条件语句,判断当前数是否是奇数,是奇数,进行累加和操作
      • 使用输出语句,打印累加和变量的值
    • c: 案例代码

        public class Test01 {
            public static void main(String[] args) {
                int sum = 0;
                for (int i = 0; i < 100; i++) {
                    if (i%2==1) {
                        sum += i;
                    }
                }
                System.out.println("累加和的值 " + sum);
            }
        }
    
 int[] sort = new int[13] { 1, 4, 89, 34, 56, 40, 59, 60, 39, 1, 40, 90, 48 };  // 输入一个数组
            for (int i = 0; i < sort.Length; i++)
            {
                int min = sort[i];  // 初始化(以第i个数为初始值)最小值
                for (int j = i+1; j < sort.Length; j++)   // 从第i+1个开始遍历数组,与第i个数对比,找到最小值
                {
                    if (sort[j] < min)
                    {
                        int temp = sort[j];
                        sort[j] = min;
                        min = temp;
                    }     // 找到最小值赋值给min
                }
                Console.Write(min + " ");  // 输出min 值
            }
实例 利用选择排序将学生成绩进行排序

在本实例中,声明了一个整型数组和两个整型变量,其中整型数组用于存储用户输入的数字,而整型变量用于存储数值最小的数组元素的数值和该元素的位置,然后通过双层循环进行选择法排序,最后将排好序的数组进行输出。具体代码如下:

01   #include<stdio.h>/*包含头文件*/

02  int main()                   /*主函数main*/

03  {

04           int i,j;                             /*定义变量*/

05           int a[10];

06           int iTemp;

07           int iPos;

08           printf("为数组元素赋值:n");

09           /*从键盘为数组元素赋值(成绩)*/

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

11           {

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

13                  scanf("%d", &a[i]); 

14           }

15           /*从高到低排序*/

16           for(i=0;i<9;i++)                                 /*设置外层循环为下标0~8的元素*/

17           {

18                  iTemp = a[i];                       /*设置当前元素为最大值*/

19                  iPos = i;                              /*记录元素位置*/

20                  for(j=i+1;j<10;j++)                     /*内层循环i+1到9*/

21                  {

22                         if(a[j]>iTemp)                      /*如果当前元素比最高值还高*/

23                         {

24                                iTemp = a[j];          /*重新设置最高值*/

25                                iPos = j;                /*记录元素位置*/

26                         }

27                  }

28                  /*交换两个元素值*/

29                  a[iPos] = a[i];

30                  a[i] = iTemp;

31           }

32   

33           /*输出数组*/

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

35           {

36                  printf("%dt",a[i]);                /*输出制表位*/

37                  if(i == 4)                             /*如果是第5个元素*/

38                         printf("n");            /*输出换行*/

39           }

40   

41           return 0;                                     /*程序结束*/

42  }

 

运行程序,显示结果如图8.18所示。

 图片 2

图8.18 
选择排序运行图

从该实例代码和运行结果可以看出:

(1)声明一个整型数组a,并通过键盘为数组元素赋值。

(2)设置一个嵌套循环,第一层循环为前9个数组元素,并在每次循环时将对应当前次数的数组元素设置为最小值(如果当前是第3次循环,那么将数组中第3个元素(也就是下标为2的元素)设置为当前的最小值);在第二层循环中,循环比较该元素之后的各个数组元素,并将每次比较结果中较小的数设置为最小值,在第二层循环结束时,将最小值与开始时设置为最小值的数组元素进行互换。当所有循环都完成以后,就将数组元素按照从小到大的顺序重新排列了。

(3)循环输出数组中的元素,并在输出5个元素以后进行换行,在下一行输出后面的5个元素。

 

本文摘自明日科技出版的《零基础学C语言》,转载请注明出处!!!

02水仙花练习功能实现

  • A: 水仙花练习功能实现

    • a: 题目分析

      • 明确什么样的数就是水仙花数。水仙花数是指一个3位数(100-999之间),其每位数字立方之和等于该3位数本身。
        如153 = 111 + 333 + 555,即 3位数本身 = 百位数立方 +
        十位数立方 + 个位数立方;
      • 获取水仙花范围内的所有3位数(100-999之间的每个3位数)
      • 判断该3位数是否满足水仙花数,满足,打印该3位数
    • b: 解题步骤

      • 使用for循环,得到100-999之间的每个3位数
      • 获取3位数中百位数字、十位数字、个位数字
      • 使用if条件语句,判断该3位数是否满足水仙花数,满足,使用输出语句,打印该3位数
    • c: 案例代码

       public class Test02 {
           public static void main(String[] args) {
               for (int i = 100; i < 1000; i++) {
                   int bai = i/100%10;
                   int shi = i/10%10;
                   int ge = i%10;
                   if (i == bai*bai*bai + shi*shi*shi + ge*ge*ge) {
                       System.out.println(i);
                   }
               }
           }
       }           
    

  

03ASCII编码表

  • A: ASCII编码表
    • a: 英文全称
      • American Standard Code for Information
        Interchange,美国标准信息交换代码
    • b: ASCII编码表由来
      • 计算机中,所有的数据在存储和运算时都要使用二进制数表示
      • a、b、c、d这样的52个字母(包括大写)、以及0、1等数字还有一些常用的符号,
        在计算机中存储时也要使用二进制数来表示
      • 具体用哪些二进制数字表示哪个符号,当然每个人都可以约定自己的一套(这就叫编码)
      • 大家如果要想互相通信而不造成混乱,那么大家就必须使用相同的编码规则,于是美国有关的标准化组织就出台了ASCII编码,
        统一规定了上述常用符号用哪些二进制数来表示。
    • c: 中文编码表
      • GB2312
      • UNICODE
    • d: 字符中重要的ASCII码对应关系
      • a : 97
      • A : 65
      • 0 : 48

04char类型的存储

  • A: char类型的存储

    • a: 取值范围

      • short:占两个字节,是有符号数据,取值范围-32768-32767
      • char: 占两个字节,是无符号数据,取值范围0-65536
    • b: 类型转换

      • char类型的数据参加运算时要线程程int数据类型
    • c: 案例代码

        /*  ASCII编码表演示
            字符Java 数据类型,char
            整数Java 数据类型,int

            int 类型和 char 数据类型转换
            char  两个字节, int 四个字节

            char转成int类型的时候,类型自动提示,char数据类型,会查询编码表,得到整数
            int转成char类型的时候,强制转换,会查询编码表

            char存储汉字,查询Unicode编码表

            char可以和int计算,提示为int类型, 内存中两个字节
            char取值范围是0-65535, 无符号的数据类型
        */
        public class ASCIIDemo{
            public static void main(String[] args){
                char c = 'a';
                int i = c + 1;
                System.out.println(i);

                int j = 90;
                char h = (char)j;
                System.out.println(h);

                System.out.println( (char)6 );

                char k = '你';
                System.out.println(k);


                char m = -1;
            }
        }   

05输出所有英文字母

  • A: 输出所有英文字母

    • a: 题目分析

      • 一共26个大小写字母,那么,可以考虑循环26次。在每次循环中,完成指定字母的大小写打印
      • 找出ABCDEFG…XYZ这些字母之间的变化规律
        通过ASCII表发现,后面的字母比它前面的字母,ASCII值大1
        下一个字母 = 上一个字母 + 1
        如: A B C D
        65 66 67 68
      • 在每次循环中打印上一个字母大小写,并指定下一个字母
    • b: 解题步骤

      • 定义初始化大写变量,值为’A’; 初始化小写变量,值为’a’
      • 使用for循环,进行26次循环
      • 在每次循环中,打印大写字母、小写字母。
        每次打印完成后,更新大写字母值、小写字母值
    • c: 案例代码

        public class Test04 {
            public static void main(String[] args) {
                char da = 'A';
                char xiao = 'a';
                for (int i = 0; i < 26; i++) {
                    System.out.println("大写字母 "+da+" ,小写字母 "+xiao);
                    da++; //更新大写字母值
                    xiao++; //更新小写字母值
                }
            }
        }
        ```
    

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website