• 一边学算法,一边学c语言之冒泡排序


    概要

      在编程中,我们可能会用到各种各样的算法,其中有些问题的对应的算法有好几种,所以我们要分析一个算法的优劣性,选择合适的算法。

    冒泡算法分析

      基于上述目的,我们需要学会算法分析这门技术,来衡量算法性能,以冒泡算法为例:

      冒泡算法:“大数下沉,小数上冒”

      伪代码描述如下(《算法分析与设计》):

    1 BUBBLE-SORT(A)
    2 for i <- 1 to length[A]
    3     do for j <- lenght[A] downto i+1
    4         do if A[j]<A[j-1]
    5             then exchange A[j] <->A[j-1]

      我们给上面的代码加上每行的代码时间开销和执行次数,其中设length[A]=n,第四行的执行次数为

    1 BUBBLE-SORT(A)                      开销 
    2 for i <- 1 to length[A]                 c1              
    3     do for j <- lenght[A] downto i+1         c1                        
    4         do if A[j]<A[j-1]                c2
    5             then exchange A[j] <->A[j-1]       c3

      第一行的执行次数为:

        n+1

      第二行的执行次数为(\sum_{i=1}^{n}(n-i+1)):

        

      第三行的执行次数为(\sum_{i=1}^{n}(n-i)):

        

      那么该算法的总运行时间为,每条语句的开销X语句的执行次数之和:

      

         

           

      算法的最佳情况:

        

        

      最坏的情况:

        

        

      这时可以写成

      增长的数量级:

      当n很大时,低阶项可以忽略,公式可以简化为:

      最坏的情况下数量级为:

      的算法会比的算法运行的快

      开始我是这么写的:

     1 #include <stdio.h>
     2 
     3 
     4 void bubble_sort(int a[],int n);
     5 
     6 void main()
     7 {
     8      int a[]={12,3,6,34,4,-44,2,10,44};
     9      bubble_sort(a);
    10      for (int i=0;i<n;i++)
    11      printf("  %d  ",a[i]);
    12      printf("\n");
    13 }
    14 
    15 void bubble_sort(int a[])
    16 {
    17      int n=sizeof(a)/sizeof(int);
    18      for (int i=0;i<n;i++)
    19      {
    20          for (int j=n-1;j>=i+1;j--)
    21          {
    22              if (a[j] < a[j-1])
    23             {
    24                  int temp=a[j];
    25                  a[j]=a[j-1];
    26                  a[j-1]=temp;
    27              }
    28          }
    29      }
    30 }

      然后发现了错误,是因为函数参数传递的参数只是一个指针,不能计算数组的大小,于是这么写的:

    #include <stdio.h>
    
    
    void bubble_sort(int a[],int n);
    
    
    void main()
    {
         int a[]={12,3,6,34,4,-44,2,10,44};
         int n=sizeof(a)/sizeof(int);
         bubble_sort(a,n);
         for (int i=0;i<n;i++)
         printf("  %d  ",a[i]);
         printf("\n");
    }
    
    
    void bubble_sort(int a[],int n)
    {
         //int n=sizeof(a)/sizeof(int);
         for (int i=0;i<n;i++)
         {
             for (int j=n-1;j>=i+1;j--)
             {
                 if (a[j] < a[j-1])
                {
                     int temp=a[j];
                     a[j]=a[j-1];
                     a[j-1]=temp;
                 }
             }
         }
    }

      总结:

      算法分析需要的是每句代码的时间开销和执行次数,在数据很大的时候可以忽略低阶项,我们一般在乎最坏时间复杂度。
      c语言函数的参数传递的数组形参只是一个地址
  • 相关阅读:
    python 命令行传参
    chardet模块下载&安装
    【解决方案】编码问题:UnicodeDecodeError: 'XXX' codec can't decode byte 0xad in position...的错误
    [解决方案]Python脚本运行出现语法错误:IndentationError: unindent does not match any outer indentation level
    perl笔记
    字符串操作
    c++错误及解决方案随记
    本地Java程序访问HTTPs遇到的问题
    学习笔记 : 异常处理
    学习笔记 : python 文件操作
  • 原文地址:https://www.cnblogs.com/fenqi/p/bubble.html
Copyright © 2020-2023  润新知