zoukankan      html  css  js  c++  java
  • 选择排序算法和冒泡算法的区别

    /选择排序法对数组中的n个数,由小到大排序
    #include<stdio.h>
     main()
     {
        int n=10,i,b,a[10];
        int sort(int array[],int n);
        // scanf("%d",&10);
        for(i=0;i<10;i++)//键盘输入数组元素
        scanf("%d",&a[i]);
        sort(a,10);//调用函数
        for(i=0;i<10;i++)//输出排序之后的函数
        printf("%3d",a[i]);

    }
       //排序子函数错误!!!!这是冒泡的思想!!!
     //int sort(int array[],int n)//排序子函数
     {
         int i,j,k,t;
         for(i=0;i<n-1;i++)//需要比较n-1次
       {
           //k=i;
           for(j=i+1;j<n;j++)//第i次比较,与第i+1个数开始比较
             {
                  if(array[j]<array[i])
                   {
                      t=array[i];
                      array[i]=array[j];
                      array[j]=t;
                   }
             }
        }

      }
    //下面是正确的子函数
       int sort(int array[],int n)//排序函数
     {
         int i,j,k,t;
         for(i=0;i<n-1;i++)//需要比较n-1次
       {
            k=i;
            for(j=i+1;j<n;j++)//第i次比较,与第i+1个数开始比较
               if(array[j]<array[k])
               k=j;//for(j)函数到这里结束了!!!!
            t=array[i];
            array[i]=array[k];
            array[k]=t;
        }
     }

    //冒泡排序法对数组中的n个数,由小到大排序
    #include<stdio.h>
    main()
    {
        int sort(int array[],int n);
        int n=10,i,j,k,a[10];
        printf("请输入10个数:\n");
        for(i=0;i<10;i++)
        scanf("%d",&a[i]);
        sort (a,10);
        printf("输出排序后的10个数:\n");
        for(i=0;i<10;i++)
        printf("%2d",a[i]);
    }
    int sort(int array[],int n)
    {
        int i,j,k;
        for (j=0;j<9;j++)
        {
    
         for(i=0;i<9-j;i++)
         {
            if(array[i]>array[i+1])
            {
                k=array[i];
                array[i]=array[i+1];
                array[i+1]=k;
            }
         }
        }
    }

    选择法:

         假定a[0]为最值,先将10个数中最小的数与a[0]对换,(只有这俩对换,其余位置不变!!!)再将a[1]~a[9]中最小的数与a[1]对换......每比较一轮,找出未经排序的最小的数。以5个数为例子说明:

    a[0]  a[1]  a[2]  a[3]  a[4]

       2      5      0       8       3

    [0]      5     [2]      8       3   将5个数中最小的与a[0]对换

    0       [2]    [5]      8       3   将余下的4个数中最小的与a[1]对换

    0        2     [3]      8      [5]   将余下的3个数中最小的与a[2]对换

    0        2      3      [5]     [8]   将余下的2个数中最小的与a[3]对换

    完成排序

    选择排序法的复杂度:O(n*n)

    冒泡排序法:

         临近数字两两依次比较,按从小到大或从大到小顺序交换,一趟过去之后,最大或最小的数字被交换到了最后一位。再从头开始比较,直到倒数第二位。

    以5个数为例子说明:

                                        a[0]  a[1]  a[2]  a[3]  a[4]

                                         2      5      0        8       3

    第一趟:第一次两两比较:   2      0      5        8       3

               第一次两两比较:   2      0      5        3     [ 8 ]

    第二趟:                         0      2      3     [  5       8 ]

    第三趟:                         0      2   [  3        5       8 ]

    第四趟:                         0   [  2      3        5       8 ]

    完成排序。

    冒泡排序法的复杂度:O(n*n)。

    两者都是效率比较低的排序方法。

         我最开始把选择和冒泡搞混了,选择的思想在于每次只有最值和第i个数对换,其余都保持原位不变!!!所以子函数里面,for循环里面的小for循环,只是把j赋给k,继续小for循环 ,不交换a[j]和a[k]的值。到外面的大for循环再交换a[j]和a[k]的值,这样就实现了选择排序。

  • 相关阅读:
    微信小程序 iPhone 11、iPhoneX 底部安全区域(底部小黑条)适配
    Servlet与vue-axios交互跨域问题之Access-Control-Allow-Origin' header contains multiple values '*, null', but only one is allowed.
    Windows10下PCL1.8.1以及Python-pcl1.81环境配置的掉发之路
    【问题记录】Navicat Premium连接mysql-8.0.17时出现2059
    mysql-8.0.17解压版安装步骤及MySQL服务无法启动问题的解决办法
    ENVI基本操作之彩色合成
    GeoServer与Udig发布矢量数据出现的问题1——预览数据一半显示正常一半重叠
    本地日志文件
    SQL语句(2)--- 函数
    SQL语句(1)--- SQL简介
  • 原文地址:https://www.cnblogs.com/sunmarvell/p/5944092.html
Copyright © 2011-2022 走看看