C语言程序设计-[18] 选择排序和冒泡排序

1、选择排序

  • 当n个数存储在a[1]~a[n]中时,选择排序的代码如下:
    for(i=1;i<=n-1;i++)

    {

           for(j=i+1;j<=n;j++)

           {

                  if(a[i]>a[j])

                  {

                         t=a[i];

                         a[i]=a[j];

                         a[j]=t;

                     }

              }

       }

注1:外循环可以理解为选数,第1轮选第1个数即a[1],第i轮选第i个数即a[i],第n-1轮选第n-1个数,即外循环for(i=1;i<=n-1;i++)。

注2:对于外循环选择的第i个数,将与这个数后面所有数进行比较,也就是说,内循环的第1轮选第i+1个数与a[i]进行比较,最后1轮选第n个数与a[i]比较,即内循环for(j=i+1;j<=n;j++)。

完整的代码和结果如下:

#include "stdio.h"



int main()

{  

       int  i,  j,  k, n,  a[50], t;

    printf("\nInput the number of  integers to sort:");

    scanf("%d", &n);

    printf("\nPlease input each integer:");

    for(i=1; i<=n; i++)     

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

     

    for(i=1;i<=n-1;i++)

    {

           for(j=i+1;j<=n;j++)

           {

                  if(a[i]>a[j])

                  {

                         t=a[i];

                         a[i]=a[j];

                         a[j]=t;

                     }

              }

       }



    printf("\nThe sorted integers:");

    for(i=1; i<=n;i++)      

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

    return 0;

}

  • 当n个数存储在a[0]~a[n-1]中时,选择排序的代码如下:
    for(i=0;i<=n-2;i++)

    {

           for(j=i+1;j<=n-1;j++)

           {

                  if(a[i]>a[j])

                  {

                         t=a[i];

                         a[i]=a[j];

                         a[j]=t;

                     }

              }

       }

注1:外循环可以理解为选数,第1轮选第1个数即a[0],第n-1轮选第n-1个数即a[n-2],即外循环for(i=0;i<=n-2;i++)。

注2:对于外循环选择的a[i],将与这个数后面所有数进行比较,也就是说,内循环的第1轮选a[i+1]与a[i]进行比较,最后1轮选最后一个数即a[n-1]与a[i]比较,即内循环for(j=i+1;j<=n-1;j++)。

完整的代码和结果如下:

#include "stdio.h"



int main()

{  

       int  i,  j,  k, n,  a[50], t;

    printf("\nInput the number of  integers to sort:");

    scanf("%d", &n);

    printf("\nPlease input each integer:");

    for(i=0; i<=n-1; i++)     

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

     

    for(i=0;i<=n-2;i++)

    {

           for(j=i+1;j<=n-1;j++)

           {

                  if(a[i]>a[j])

                  {

                         t=a[i];

                         a[i]=a[j];

                         a[j]=t;

                     }

              }

       }



    printf("\nThe sorted integers:");

    for(i=0; i<=n-1;i++)      

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

    return 0;

}

2、冒泡排序

  • 当n个数存储在a[1]~a[n]中时,冒泡排序的代码如下:

   

    for(i=1;i<=n-1;i++)

    {

           for(j=1;j<=n-i;j++)

           {

                  if(a[j]>a[j+1])

                  {

                         t=a[j];

                         a[j]=a[j+1];

                         a[j+1]=t;

                     }

              }

       }

注1:外循环可以理解为轮次,对于n个数,冒泡排序的轮次为n-1轮,即外循环for(i=1;i<=n-1;i++)。

注2:内循环的第1轮是n个数从头至尾进行相邻比较,第2轮是前n-1个数从头至尾进行相邻比较,第n-1轮前两个数进行相邻比较,也就是j的范围是第1个数~倒数第2个数,要不然要相邻比较的a[j+1]就越界了,即内循环for(j=1;j<=n-i;j++)。其实,这个边界很容易确定:第一,j=1是否为第1个数;第二,把i的起始值代入j=n-i,看j=n-i是否为倒数第2个数。

完整的代码和结果如下:

#include "stdio.h"



int main()

{  

       int  i,  j,  k, n,  a[50], t;

    printf("\nInput the number of  integers to sort:");

    scanf("%d", &n);

    printf("\nPlease input each integer:");

    for(i=1; i<=n; i++)     

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

     

    for(i=1;i<=n-1;i++)

    {

           for(j=1;j<=n-i;j++)

           {

                  if(a[j]>a[j+1])

                  {

                         t=a[j];

                         a[j]=a[j+1];

                         a[j+1]=t;

                     }

              }

       }



    printf("\nThe sorted integers:");

    for(i=1; i<=n;i++)      

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

    return 0;

}

  • 当n个数存储在a[0]~a[n-1]中时,冒泡排序的代码如下:
    for(i=1;i<=n-1;i++)

    {

           for(j=0;j<=n-i-1;j++)

           {

                  if(a[j]>a[j+1])

                  {

                         t=a[j];

                         a[j]=a[j+1];

                         a[j+1]=t;

                     }

              }

       }

注:由于外循环只是循环轮次,所以只需要修改内循环边界,使之符合上面所述第1个数和倒数第2个数的判定规则即可. 其中,j=0是第1个数,把i=1代入j=n-i-1得到j=n-2是倒数第2个数。

完整的代码和结果如下:

#include "stdio.h"



int main()

{  

       int  i,  j,  k, n,  a[50], t;

    printf("\nInput the number of  integers to sort:");

    scanf("%d", &n);

    printf("\nPlease input each integer:");

    for(i=0; i<=n-1; i++)     

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

     

    for(i=1;i<=n-1;i++)

    {

           for(j=0;j<=n-i-1;j++)

           {

                  if(a[j]>a[j+1])

                  {

                         t=a[j];

                         a[j]=a[j+1];

                         a[j+1]=t;

                     }

              }

       }



    printf("\nThe sorted integers:");

    for(i=0; i<=n-1;i++)      

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

    return 0;

}

  • 14
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
冒泡排序是一种简单的排序算法,其基本思路是不断比较相邻的两个数,如果前一个数比后一个数大,则交换这两个数的位置,这样一趟下来,最大的数就会被交换到最后面。然后继续进行下一轮比较,直到所有数都排好序。 冒泡排序c语言程序设计思路如下: 1. 定义一个数组,用于存放需要排序的数。 2. 根据冒泡排序的基本思路,需要进行多轮比较和交换操作,因此需要使用一个循环嵌套来实现。 3. 外层循环控制比较和交换的轮数,内层循环控制每一轮的比较和交换次数。 4. 在内层循环中,依次比较相邻的两个数,如果前一个数比后一个数大,则交换它们的位置。 5. 内层循环结束后,最大的数就会被交换到数组的最后面,因此在下一轮比较中,可以排除已经排好序的数,即将内层循环的比较次数减1。 6. 外层循环结束后,数组中的数就按从小到大的顺序排好了。 下面是一个示例代码: ``` void bubble_sort(int arr[], int n) { int i, j, temp; for (i = 0; i < n - 1; i++) { for (j = 0; j < n - i - 1; j++) { if (arr[j] > arr[j + 1]) { temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } ``` 在这个示例代码中,使用了两层循环,外层循环控制比较和交换的轮数,内层循环控制每一轮的比较和交换次数。在内层循环中,如果前一个数比后一个数大,则进行交换操作。最终,数组中的数就按从小到大的顺序排好了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值