zoukankan      html  css  js  c++  java
  • 排序2之冒泡与选择排序

    #include <stdio.h>

    #define N 10

    int main()

    {     int a[N];    

    int i,j,temp;    

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

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

       for(i=0;i<N-1;i++) //冒泡排序的核心代码,通过比较相邻两个,达到排序效果.     

      for(j=1;j<N-i;j++)//可以自己举例子按算法过程来实现         

    if(a[j]<a[j-1])          

    {              

    temp=a[j];          

         a[j]=a[j-1];     

              a[j-1]=temp;      

         }    

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

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

    那么冒泡排序是否可以优化呢,来看下面的程序

    #include <stdio.h>

    #define N 10 int main()

    {     int a[N];    

    int i,j,temp,flag;//添加了一个flag标志  

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

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

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

    {         flag=0;          //添加了一个flag      

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

         if(a[j]<a[j-1])     

          {   flag=1;  // 想下flag的作用       

            temp=a[j];               a[j]=a[j-1];     

              a[j-1]=temp;

              }        

    if(flag==0) //哈哈想到了吧,没想到的话,自己可以在纸上模拟这个过程,flag在一定情况下可以加快排序速度        

       break;    

    }    

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

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

      return 0;

    } 当然可以把代码写的更简洁点

    #include <stdio.h>

    #define N 10

    #define swap(x,y) {int t=x;x=y;y=t;}

    int main()

    {

        int a[N];

        int i,j,flag=1;

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

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

        for(i=0;i<N-1&&flag;i++)

          for(flag=0,j=1;j<N-i;j++)

             if(a[j]<a[j-1])

              {   flag=1;

                  swap(a[j],a[j-1]);

              }

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

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

        return 0;

    }

    选择排序

    #include <stdio.h>

    #define N 10

    #define swap(x,y) {int t=x;x=y;y=t;}//或者void swap(int &x,int& y) {int t=x;x=y;y=t;}

    int main()

    {    

    int a[N];     int i,j,k;   

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

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

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

      {        

    k=i;      

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

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

       k=j;//注意这里与冒泡排序的区别,标记最小的,只是最小的与i个对换       

        swap(a[i],a[k]);

        }    

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

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

       return 0;

    }

     
  • 相关阅读:
    2013 Multi-University Training Contest 6 部分解题报告
    2013 Multi-University Training Contest 5 部分解题报告
    Codeforces Round #195 (Div. 2) 解题报告
    (转) tarjan算法
    重装SQLServer2008
    关于此博客园及其美化
    矩阵乘法
    CSP-S2019部分题解
    二维偏序
    [BOI2003]团伙
  • 原文地址:https://www.cnblogs.com/heqinghui/p/2615575.html
Copyright © 2011-2022 走看看