eg 5-7 Sorting by selection

/*
    用选择法对从键盘上输入的10个数据按从小到大的顺序排序
    分析:
          选择法的思想是;先把第一个元素作为最小者,与后面元素比较
          如第一个元素大,则与其交换(保证第一个元素总是很小),直
          到与最后一个元素比较完,第一趟就找出了最小元素,且保存在
          第一个元素位置。再以第二个元素作为最小者(次小)与后面元
          素比较,若后面元素小,则交换,直到最后一个元素,第二小的
          元素已找到。以此类推,经九趟后排定


#include <stdio.h>

int main()
{
    int i,j,temp;
    int a[10];
    printf("请输入十个数:\n");
    for(i=0;i<10;i++)       //循环输入10个数给数组赋值
        scanf("%d",&a[i]);
    //和冒泡排序法比较的次数相同n-1
    for(i=0;i<9;i++)            //共比较9次  n-1
        for(j=i+1;j<10;j++)     //每一次比较10-i-1次
            if(a[i]>a[j])       //每一个数都和后面的数依次比较,如果大于后面的数,则进行交换
            {
                temp=a[j];
                a[j]=a[i];
                a[i]=temp;
            }
    printf("输出排序后的数 \n");//循环输出排序后的数
    for(i=0;i<10;i++)
        printf("%d\t",a[i]);
    return 0;
}

  此例中,使用两重循环来实现排序。外层循环控制排序趟数,若数组中有n个元素,则共进行n-1趟。
  内层循环完成在剩余的数中选择最小的数,比较次数随趟数递减,循环控制变量j的初值与 外循环
  执行次数有关:j=i+1,终值为n.当后面元素较大时,马上交换。值得注意的是:以上程序执行时元
  素的交换并不都是必须的。实际上,只要记住比较时小元素的位置,即序号,在内循环结束时做一
  次循环即可,从而提高程序执行的效率。
*/


/*
    经过改进后的程序每一趟只需要交换一次元素(注意:元素一般是一个比较复杂的数据结构,交换所需要的时间比整数的
    赋值要多),提高了程序执行的效率。
*/

#include "stdio.h"

int main()
{
    int a[10],i,j,k,temp;          //i,j 是循环变量  k始终存储本趟最小元素的下标 temp:交换时的暂存值 a[10]:存储输入的是个数据
    printf("请输入十个数: \n");
    for(i=0;i<10;i++)              //循环输入十个数据
    scanf("%d",&a[i]);
    printf("输出输入的十个数: \n");
    for(i=0;i<10;i++)              //循环输出十个数据
        printf("%d ",a[i]);
        printf("\n");
        /*
    for(i=0;i<9;i++)               //十个数据,每个数都和剩下几个数相比较,共比较九次
    {
        k=i;                       //k始终存放本趟最小元素的下标,开始时为i
        for(j=i+1;j<10;j++)        //每个元素都比较10-i-1次

         if(a[i]>a[j])             ///注意这个if语句的括号   在这个程序中是必须包含的
         {
            k=j;                   //记住新的最小元素的序号
            if(k!=i)               //判断第一个元素是否是最小的元素,若k!=i,则说明和其他元素比较的这个元素不是最小的,进行交换
            {
                temp=a[j];
                a[j]=a[i];
                a[i]=temp;
            }                      //这部分注释的地方和第一种方法是一样的,k没有什么作用
         }
    }
    */
    for(i=0;i<9;i++)           //十个数据,每个数都和剩下几个数相比较,共比较九次
    {
        k=i;                       //k始终存放本趟最小元素的下标,开始时为i
        for(j=i+1;j<10;j++)        //每个元素都比较10-i-1次

         if(a[k]>a[j])             ///注意这个if语句的括号   在这个程序中是必须包含的
            k=j;                   //记住新的最小元素的序号
            if(k!=i)               //判断第一个元素是否是最小的元素,若k!=i,则说明和其他元素比较的这个元素不是最小的,进行交换
            {
                temp=a[k];
                a[k]=a[i];
                a[i]=temp;
            }
    }
    printf("排序后的十个数是:\n");
    for(i=0;i<10;i++)              //循环输出排序后的数   循环变量用i和j都行
        printf("%d ",a[i]);
        printf("\n");
    return 0;
}
/*
    总结下:

        for(i=0;i<9;i++)           //十个数据,每个数都和剩下几个数相比较,共比较九次
    {
        k=i;                       //k始终存放本趟最小元素的下标,开始时为i
        for(j=i+1;j<10;j++)        //每个元素都比较10-i-1次
         if(a[i]>a[j])             ///注意这个if语句的括号   在这个程序中是必须包含的
              k                       开始理解错误的点在于循环判断一直用的是a[i],但设的是k始终保存的是最小数的下标,
                                      应该用k下标的数去和其他数进行比较
            k=j;                   //记住新的最小元素的序号
            if(k!=i)               //判断第一个元素是否是最小的元素,若k!=i,则说明和其他元素比较的这个元素不是最小的,进行交换
            {
                temp=a[k];
                a[k]=a[i];
                a[i]=temp;
            }
    }
书上所描述的第二种方法的核心算法如上:开始理解有些错误  在第一个if语句的判断

*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值