选择排序算法和冒泡算法的区别

青春壹個敷衍的年華 提交于 2020-03-15 04:54:05

/选择排序法对数组中的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]的值,这样就实现了选择排序。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!