排序算法分析

(1)冒泡排序:

排序是从后往前排的,先将最后一个数确定再一次向前。冒泡就是像冒水泡一样,只不过是从上往下冒的第一次冒到下边后第二次之能冒到第一次的上一个位置。然后一次递减。

int main()

{

      int a[10];

      int i,j;

     for(i=0;i<10;i++)

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

     for(i=0;i<10;i++)

      {

             int k;

             for(j=0;j<9-i;j++)

            {

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

                  {

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

                  }

            }

      }

      for(i=0;i<10;i++)

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

      return 0;

}

两个for循环:第一个是控制循环的次数,有几个数循环几次,第二个for是控制每一次的循环的比较次数,,完成一次循环后比较次数就减少一次。

(2)选择排序

排序是从前往后排的。大致方法与冒泡差不多,,,只不过选择比较后记录的是元素的下标。

对a[10]中的十个元素排序

for ( i = 0 ; i < 9 ; i + + )

{

       int min = i ;

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

       {

             iif( a [ min ] > a [ j ] )

                   min = j;

       }

      if(min != i)

      {

             k=a [ min ] ;

            a [ min ] = a [ i ] ;

           a [ i ] = k ;

      }

}//升序排序

j = i + 1 因为是从前往后排每循环一次就排少一个,,第二个for中min = j,,是在每一次的循环中找到最小值对应的下标与a [ min ] 进行交换 。

(3)快速排序

是选定第一个数为标准,,将第一个数赋给另一个变量,,此时第一个元素可以直接覆盖,,因为已经将其拿了出来,将 k 和最后一个元素进行比较若符合条件吧最后一个数和第一个交换,,否则将 k 和倒数第二个进行比较。若最后一个数和前边的数交换,此时最后一个元素的空间可以直接被覆盖。

void QuickSort ( int  a [ ] , int n )

{

     if ( n > 1 )

    {

         int  i=0 , j=n-1 ;

        int k = a [ 0 ] ;

        while ( i < j )

        {

               for ( ; i < j ; j - - )

               {

                     if ( k > a [ j ] )
                     {

                           a [ i ] = a [ j ] ;i + + ; break ;

                     }

               }

               for ( ; i < j ; i + + )

              {

                     if ( k < a [  i ] )

                    {

                          a [ j ] = a [ i ] ; j - - ; break ;   

                    } 

              }

        }

    }

   a [ i ] = k ;

   QuickSort ( a , i ) ;

   QuickSort ( a+i+1 ; n-1-i) ;

}//升序

if ( n > 1 )因为只有超过两个元素才可以进行排序,,while条件是循环终止的条件,,结束后将 k 值赋给第 i 个元素此时 a [ i ] 就是中间值前边的都比 k 小,后边的都比 k 大。最后两个QuickSort是递归调用。

在c++中可以直接调用快排。。不过其默认是升序

#include < algorithm >

using namespace std ;

bool cmp ( int n , int b)//可以将默认的升序改为降序

{

     return  a >  b ;

}

int main()

{

           int a[10] ; //对其排序

           sort ( a , a+10 , cmp) ;

}

写 a  + 10  即末元素多一个数的地址

(4)插入排序

将第一个元素和后边的分开,然后用后边的元素和其进行比较,如果比 a [ 0 ]  小就放在它的前边,如果大就不用管,,直接进行下一次比较。

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

{

    int  t = a [ 0 ];

    for(j=i-1;j>=0;j--)//a [ j ] 从有序的数的最后一个数进行比较

    {

           if(t< a [ j ]  )

          {

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

                a [ j ] = t;

          }//如果t》a [ j ] 直接i++就已经把 a [ i ] 放在了有序的最后一位

    }

}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值