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

    冒泡排序速记口诀(降序):

    N个数字来排序,两两相比大靠前,

    外层循环N-1,内层循环N-1-i.

    如果要升序,

    只要把程序中的if (a[j] < a[j + 1])

    小于号换成大于号就行了

    定义数组:int array[10]={4,2,6 ,9 ,22,1,100};

    冒泡排序的过程如下:

     

    第一次冒泡:

     将第一个数4与第二个数2比较,4>2则位置不变,再将第二个数2与第三个数6进行比较,

                   2<6,则将2与6交换位置。

    以此类推,2<9,2与9交换位置,

                  2<22,2与22交换位置,

      2>1,则位置不变,

                1<100,则1与100交换位置。

    此趟结束后数组为{4,6,9,22,2,100,1}

     

    第二次冒泡:

    将4与6进行比较,4<6,交换位置,

                          4<9交换位置,

                         4<22交换位置,

    4>2,位置不变,

                       2<100交换位置,

    2>1位置不变

    此趟结束后数组为{6,9,22,4,100,2,1}

     

    第三次冒泡:

    将6与9比较,  6<9交换位置,

                       6<22交换位置,

    6>4位置不变, 4<100交换位置,

    4>2位置不变,

    2>1位置不变

    此趟结束后数组为{9,22,6,100,4,2,1}

     

    第四次冒泡:

    将9与22比较,9<22交换位置,

    9>6位置不变,

                      6<100交换位置,此后位置不变。

    此趟结束后数组为{22,9,100,6,4,2,1}

     

    第五次冒泡:

     

    22与9比较位置不变,9与100比较,交换位置,此后位置不变。

    此趟结束后数组为{22,100,9,6,4,2,1}

     

    第六次冒泡:

     

    22与100比较,交换位置,此后位置不变。

    此趟结束后数组为{100,22,9,6,4,2,1}

     

    #n为数组长度

     

    其实现代码为

    int i,j,t;

    int a[n];

    for( i=0;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;         }

      }

    }



    #include  
    
    void main()   
    
    {   
    
      int a[10];   
    
      int i,j,t;   
    
      printf("输入10个整数:
    ");   
    
      for( i = 0; i < 10; i ++ )   
    
      scanf("%d",&a[ i ]); //依次输入10个整数  
    
      for( j = 0; j < 9; j ++ ) //进行9轮排序 即n-1次  
    
       {
    
       for( i = 0; i < 9-j; i ++) //每轮进行n-1-j 次比较,最多n-1-j 次交换
    
      if( a[ i ] > a[ i + 1 ] )
    
       {
    
       t = a[ i ] ;
    
       a[ i ] = a[ i + 1 ]; //小的沉底,大的上浮
    
       a[ i + 1 ] = t;
    
       }
    
       }
    
       printf("排序结果:");
    
       for( i = 0; i < 10; i ++ ) //依次输出排序结果
    
      printf("%d	",a[ i ]);
    
       printf("
    "); 
    
    }
    View Code









    //冒泡排序 #include <stdio.h> #define N 100 void sort(int n,int a[]) { int i,j,t ; for(i=0;i<n-1 ;i++) for(j=0;j<n-1-i ;j++) if(a[j]>a[j+1]) { t=a[j] ;a[j]=a[j+1] ;a[j+1]=t ;} } int main ( ) { int a[N],n ,i ; scanf("%d",&n); for(i=0;i<n ;i++) scanf("%d",&a[i]); sort(n,a) ; for(i=0;i<n-1 ;i++) printf("%d",a[i]); printf("%d ",a[i]); } //冒泡排序 #include <stdio.h> void sort(int n,int a[]) { int i,j,t ; for(i=0;i<n-1 ;i++) for(j=0;j<n-1-i ;j++) if(a[j]>a[j+1]) { t=a[j] ;a[j]=a[j+1] ;a[j+1]=t ;} } int main ( ) { int b[5]={ 0 ,5, 3, 1 ,2 },i ; sort(5,b) ; for(i=0;i<5 ;i++) printf("%d ",b[i]); } //冒泡排序 #include <stdio.h> void sort(int n,int a[]); // 声明 //void sort(int n,int b[]); int main ( ) { int b[5]={ 0 ,5, 3, 1 ,2 },i ; sort(5,b) ; for(i=0;i<5 ;i++) printf("%d ",b[i]); } void sort(int n,int a[]) { int i,j,t ; for(i=0;i<n-1 ;i++) for(j=0;j<n-1-i ;j++) if(a[j]>a[j+1]) { t=a[j] ;a[j]=a[j+1] ;a[j+1]=t ;} } //冒泡排序 #include <stdio.h> void sort(int b[]); // 声明 //void sort(int a[]); int main ( ) { int b[5]={ 0 ,5, 3, 1 ,2 },i ; sort(b) ; for(i=0;i<5 ;i++) printf("%d ",b[i]); } void sort(int a[]) { int i,j,t ; for(i=0;i<5-1 ;i++) for(j=0;j<5-1-i ;j++) if(a[j]>a[j+1]) { t=a[j] ;a[j]=a[j+1] ;a[j+1]=t ;} } //冒泡排序 #include <stdio.h> void sort(int a[]); // 声明 int main ( ) { int a[5]={ 0 ,5, 3, 1 ,2 },i ; sort(a) ; for(i=0;i<5 ;i++) printf("%d ",a[i]); } void sort(int a[]) { int i,j,t ; for(i=0;i<5-1 ;i++) for(j=0;j<5-1-i ;j++) if(a[j]>a[j+1]) { t=a[j] ;a[j]=a[j+1] ;a[j+1]=t ;} } 与冒泡排序相比,选择排序的平均时间复杂度比冒泡排序稍高。
    基本思想: 每一趟从待排序的元素中选出最小(或者最大)的一个元素顺序放在已排好序的数列的 最后,
    直到全部待排序的数据元素排完。
    选择排序是不稳定的排序方法,
    N个记录的文件的直接选择排序可经过N-1趟直接选择排序得到有序结果。

    示例如下: 定义数组a[]={13,4,8,2,11,67,0}

    第一趟:a[]={0,4,8,2,11,67,13}

    第二趟: a[]={0,2,8,4,11,67,13}

    第三趟:a[]={0,2,4,8,11,67,13}

    第四趟:a[]={0,2,4,8,11,67,13}

    第五趟:a[]={0,2,4,8,11,67,13}

    第六趟:a[]={0,2,4,8,11,13,67}

    算法描述如下:

    int a[n];//定义数组,长度为n int i,j,t;

    for(i=0;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;        }  

       }

    }





    #include
     void main()
      {int i,j,min,temp,a[11];
        printf("enter data:
    ");
        for(i=1;i<=10;i++)
         {printf("a[%d]=",i);
           scanf("%d",&a[i]);//输入10个数
         }
        printf("
    ");
        printf("The orginal numbers:
    ");
        for(i=1;i<=10;i++)
          printf("%5d",a[i]);//输出这10个数
       printf("
    ");
        for(i=1;i<=9;i++)//以下8行是对10个数排序
        {min=i;
           for(j=i+1;j<=10;j++)
             if(a[min]>a[i])  min=j;//以下是进行对换
          temp=a[i];
           a[i]=a[min];
           a[min]=temp;
         }
       printf("
     The sorted numbers:
    ")
       for(i=1;i<=10;i++)
          printf("%5d",a[i]);//输出已排好的10个数
       printf("
    ");
        
     }
    View Code
    
    
    #include <iostream>     //选择 
    using namespace std;
    void f(int a[],int n)
    {
    int i,j ,min,p,t ;
    for(i=0 ; i<n-1 ;i++)
    {
        min=a[i] ;  p=i ;
    for(j=i+1 ; j<n ; j++)
     if(a[j]<min)     min=a[i],p=j ;            // if(a[j]<min)   min=a[i]    ;       p=j ;
     if(p!=i)      t=a[p] ,a[p]=a[i] ,a[i]=t ;
    }
    }
    
    int main( )
    {
    int a[10],i ;
    for(i=0 ; i<10 ; i++)
      cin>>a[i] ;
      f(a,10) ;
    for(i=0 ; i<10 ; i++)
      cout<<a[i]<<endl  ;	
      
    }
    
    
    
    
    
    
    
    
    #include <iostream>            //选择  
    using namespace std;
    void f(int a[],int n)
    {
    int i,j ,min,p,t ;
    for(i=0 ; i<n-1 ;i++)
    {
         min=a[i] ;  p=i ;
    for(j=i+1 ; j<n ; j++)
         if(a[j]<min)   min=a[i], p=j ;
      if(p!=i)      t=a[p] ,a[p]=a[i] ,a[i]=t ;
    }
    }
    
    int main( )
    {
    int N ;
    cin>> N;
     int a[N];
    int i ;
    for(i=0 ; i<N ; i++)
      cin>>a[i] ;
      
      f(a,N) ;
    for(i=0 ; i<N ; i++)
      cout<<a[i]<<endl  ;	  
    }
    
    
    
    
    
    
    
    #include <stdio.h>     //选择
    
    void sort(int a[]) ;
    int main ( )
    {
      int a[5]={ 9,6,8,3,-1},i ;
       sort(a) ;
       for(i=0 ;i<=4 ;i++)
       printf("%4d",a[i]) ;	
    
    }
    
    void  sort(int a[])
    { int i,j,t,k ;
     for(j=0 ; j<4 ;j++)      // j<3 ,4,5 ????
     {
     	k=j ;
     	for(i=j ;i<5 ;i++)
     	if(a[i]<a[k])  k=i ;
     	t=a[k] ,a[k]=a[j] ,a[j]=t ;
     }
    	
    }
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    #include <stdio.h>    ////选择
    
    void  sort(int a[])
    { 
    int i,j,t,k,n ;
     for(j=0 ; j<3 ;j++)          //  j<3 ,4,5 ????
     {
     	k=j ;
     	for(i=j ;i<5 ;i++)
     	if(a[i]<a[k])  k=i ;
     	t=a[k] ,a[k]=a[j] ,a[j]=t ;
     }
    	
    }
    
    int main ( )
    {
      int a[5]={ 9,6,8,3,-1},i ;
       sort(a) ;
       for(i=0 ;i<=4 ;i++)
       printf("%4d",a[i]) ;	
    
    }
    

      

    C 冒泡排序 
    
    
    
    
    冒泡排序描述
    
    冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
    
    冒泡排序对n个项目需要O(n2)的比较次数,且可以原地排序(in-place)。尽管这个算法是最简单了解和实作的排序算法之一,但它对于少数元素之外的数列排序是很没有效率的。
    
    冒泡排序是与插入排序拥有相等的执行时间,但是两种法在需要的交换次数却很大地不同。在最坏的情况,冒泡排序需要O(n2)次交换,而插入排序只要最多O(n)交换。天真的冒泡排序实作(类似下面)通常会对已经排序好的数列拙劣地执行(O(n2)),而插入排序在这个例子只需要O(n)个运算。因此很多现代的算法教科书避免使用冒泡排序,而用插入排序取代之。冒泡排序如果能在内部循环第一次执行时,使用一个旗标来表示有无需要交换的可能,也有可能把最好的复杂度降低到O(n)。在这个情况,在已经排序号的数列就无交换的需要。若在每次走访数列时,把走访顺序和比较大小反过来,也可以些微地改进效率。
    
    冒泡排序算法的运作如下:
    
    比较相邻的元素。如果第一个比第二个大,就交换他们两个。
    1.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
    2.针对所有的元素重复以上的步骤,除了最后一个。
    3.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
    
    示例代码
    
    
    复制代码
     1 #include <stdlib.h>
     2 #include <stdio.h>
     3 
     4 void bubble_sort(int a[], const int size)
     5 {
     6     int flag = 0;
     7     int temp = 0;
     8     int i;
     9     for(i = 0; i < size - 1; i ++) {
    10         flag = 1;
    11         int j;
    12         for(j = 0; j < size - i -1; j ++) {
    13             if(a[j] > a[j + 1]) {
    14                 temp = a[j];
    15                 a[j] = a[j + 1];
    16                 a[j + 1] = temp;
    17                 flag = 0;
    18             }
    19         }
    20         if(flag)
    21             break;
    22     }
    23 }
    24 
    25 int main()
    26 {
    27     int number[] = {5,3,8,4,1,7,9,2,0,6};
    28     bubble_sort(number, sizeof(int_array) / sizeof(int));
    29     int i;
    30     for(i = 0; i < sizeof(int_array) / sizeof(int); i ++)
    31         printf("%d
    ", number[i]);
    32 }
    
    复制代码
    
    输出结果
    
    
    复制代码
    0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    复制代码
    
    原理
    
    已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。首先比较a[1]与a[2]的值,若a[1]大于a[2]则交换两者的值,否则不变。再比较a[2]与a[3]的值,若a[2]大于a[3]则交换两者的值,否则不变。再比较a[3]与a[4],以此类推,最后比较a[n-1]与a[n]的值。这样处理一轮后,a[n]的值一定是这组数据中最大的。再对a[1]~a[n-1]以相同方法处理一轮,则a[n-1]的值一定是a[1]~a[n-1]中最大的。再对a[1]~a[n-2]以相同方法处理一轮,以此类推。共处理n-1轮后a[1]、a[2]、……a[n]就以升序排列了。
    
    优劣
    
      优点:稳定;缺点:慢,每次只能移动相邻两个数据。 
    View Code
    C 选择排序 
    
    
    
    
    选择排序描述
    
    选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾。以此类推,直到所有元素均排序完毕。
    
     示例代码
    
    
    复制代码
     1 #include <stdlib.h>
     2 #include <stdio.h>
     3 
     4 void selection_sort(int data[], int count)
     5 {
     6     int i, j, min, temp;
     7     for(i = 0; i < count -1; i ++) {
     8         /*find the minimum*/
     9         min = i;
    10         for(j = i + 1; j < count; j ++)
    11             if(data[j] < data[min])
    12                 min = j;
    13         temp = data[i];
    14         data[i] = data[min];
    15         data[min] = temp;
    16         printf("%d
    ", min);
    17     }
    18 }
    19 
    20 int main()
    21 {
    22     int number[] = {5,3,8,4,1,7,9,2,0,6};
    23     selection_sort(number, 10);
    24     int i;
    25     for(i = 0; i < 10; i ++)
    26         printf("%d
    ",number[i]);
    27     exit(0);
    28 }
    
    复制代码
    
    输出结果
    
    
    复制代码
    0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    复制代码
    
    算法分析
    
    选择排序的交换操作介于0和(n − 1)次之间。选择排序的比较操作为n(n − 1) / 2次之间。选择排序的赋值操作介于0和3(n − 1)次之间。比较次数O(n^2),比较次数与关键字的初始状态无关,总的比较次数N=(n-1)+(n-2)+...+1=n*(n-1)/2。 交换次数O(n),最好情况是,已经有序,交换0次;最坏情况是,逆序,交换n-1次。 交换次数比冒泡排序少多了,由于交换所需CPU时间比比较所需的CPU时间多,n值较小时,选择排序比冒泡排序快。
    
    原理
    
      每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。
    
      选择排序是不稳定的排序方法(很多教科书都说选择排序是不稳定的,但是,完全可以将其实现成稳定的排序方法)。 
    
      n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果:
    
        ①初始状态:无序区为R[1..n],有序区为空。
    
        ②第1趟排序
    
          在无序区R[1..n]中选出关键字最小的记录R[k],将它与无序区的第1个记录R[1]交换,使R[1..1]和R[2..n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
    
        ③第i趟排序
    
         第i趟排序开始时,当前有序区和无序区分别为R[1..i-1]和R(1≤i≤n-1)。该趟排序从当前无序区中选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1..i]和R分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
    
      这样,n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果。
    
    优劣
    
      优点:移动数据的次数已知(n-1次);缺点:比较次数多,不稳定。
    View Code
  • 相关阅读:
    .NET Core技术研究-通过Roslyn代码分析技术规范提升代码质量
    ASP.NET Core技术研究-全面认识Web服务器Kestrel
    .NET Core技术研究-主机Host
    ASP.NET Core技术研究-探秘依赖注入框架
    ASP.NET Core技术研究-探秘Host主机启动过程
    .NET Core技术研究-中间件的由来和使用
    深入浅出腾讯BERT推理模型--TurboTransformers
    深入浅出PyTorch(算子篇)
    深入浅出Transformer
    生产者消费者问题总结
  • 原文地址:https://www.cnblogs.com/wc1903036673/p/3488277.html
Copyright © 2011-2022 走看看