zoukankan      html  css  js  c++  java
  • 冒泡排序

    实现规则为:首先制定排序规则,然后,依次两两比较待排序的数据,若不符合排序规则,则进行交换,然后依次比较下去,直到全部元素排列有序为止。
      示例1:有如下一组数据{85,279,948,521,616,888},按照从大到小的顺序排列,使用冒泡排序,首先执行第一趟交换,过程如图所示。  
                                                               
            经过五趟数据比较与交换后,数据顺序变为由大到小的有序序列。从而实现了使用冒泡排序的目的。其一般表达函数为:
    void BubbleSort(dataList r[], int n)
    {
    int loop1, loop2, temp;
    for(loop1=1;loop1<=n-1;loop1++) //外层循环,控制循环比较趟数
    {
    for(loop2=n;loop2>=loop1+1;loop2--) //内层循环,控制比较位置
    {
    if(r[loop2] < r[loop2-1]) //判断是否符合交换规则
    {
    temp=r[loop2];
    r[loop2]=r[loop2-1];
    r[loop2-1]=temp;
    }
    }
    }

     示例2:

    # include <stdio.h>
    void sort(int * a, int len)
    {
        int i, j, t;

        for (i=0; i<len-1; i++)
        {
            for (j=0; j<len-1-i; j++)
            {
                if (a[j] > a[j+1])   //>表示升序   <表示降序
                {
                    t = a[j];
                    a[j] = a[j+1];
                    a[j+1] = t;
                }
            }
        }
        
    }

    int main(void)
    {
        int a[6] = {1037511,-1};
        int i = 0;

        sort(a, 6);

        for (i=0; i<6; i++)
        {
            printf("%d ",a[i]);
        }
        printf("\n");

        return 0;
    }

    示例3:给输入的10个数字进行排序,将他们以从小到大的顺序输出到屏幕上 

    方法一:
    #include <stdio.h>
     main()
     {
         int a[10];
         int i, j, t;
         printf("输出10个数字:\n");
         for(i=0; i<9; i++)
         {
             scanf("%d",&a[i]);
         }
         printf("\n");
         //冒泡排序法
         for(j=0;j<=9;j++)
         {
             for(i=0;i<=9-j;i++)
             {
              if(a[i] > a[i+1])
              {
                  t = a[i];
                  a[i] = a[i+1];
                  a[i+1] = t;
              }
             }
         }
         printf("输出排序后的数字:\n");
         for(i=1; i<=9; i++)
         {
             printf("%d ",a[i]);
         }
         
         printf("\n");
     }
     

    方法二:
    # include <stdio.h>

    //冒泡排序
    void sort(int * a, int len)
    {
        int i, j, t;

        for (i=0; i<len-1; i++)
        {
            for (j=0; j<len-1-i; j++)
            {
                if (a[j] > a[j+1])   //>表示升序   <表示降序
                {
                    t = a[j];
                    a[j] = a[j+1];
                    a[j+1] = t;
                }
            }
        }
        
    }

    int main(void)
    {
        int a[10];
        int i=0;
        int j;
        printf("输入10个数字:\n");
        for(j=0; j<=9; j++)
        {
            scanf("%d", &a[j]);
        }
        printf("\n");
        
        //排序
        sort(a, 10);
        //打印出排完序的数字,遍历
            
        for (i=0; i<=9; i++)
        {
            printf("%d ",a[i]);
        }
        printf("\n");

        return 0;

     优劣:冒泡排序时间复杂度为O(n^2),虽然不及堆排序快速排序的O(nlogn,底数为2),

               但是有两个优点:

        1.“编程复杂度”很低,很容易写出代码;

    2.具有稳定性,这里的稳定性是指原序列中相同元素的相对顺序仍然保持到排序后的序列,而堆排序、快速排序均不具有稳定性。

  • 相关阅读:
    UTF8 GBK UTF8 GB2312 之间的区别和关系
    error
    adb
    没有在Manifest.xml中注册Activity
    office 2003打开2007版文件插件(附官方下载地址): compatibility pack for the 2007 office system
    R包MetaboAnalystR安装指南(Linux环境非root)
    R合并数据框有重复匹配时只保留第一行
    质谱行业介绍
    蛋白质组学数据分析——(1)原理
    [R报错] Kruskalwallis test 所有组的层次都必需是有限的
  • 原文地址:https://www.cnblogs.com/hanjun/p/2798567.html
Copyright © 2011-2022 走看看