zoukankan      html  css  js  c++  java
  • 冒泡排序、选择排序及插入算法

    一、冒泡排列

    冒泡排序的原理如下,以8个数由大到小排列为例,进行说明,数据存放在数组a[8]中。

    假如8个数分别为4、9、10、3、2、14、11、5。

    a[0]<a[1]即4<9,故交换位置,9、4、10、3、2、14、11、5

    a[1]<a[2]即4<10,故交换位置,9、10、4、3、2、14、11、5

    a[2]>a[3]即4>3,位置不变,继续比较

    a[3]>a[4]即3>2,位置不变,继续比较

    a[4<a[5]即2<14,故交换位置,9、10、4、3、14、2、11、5

    a[5]<a[6]即2<11,故交换位置,9、10、4、3、14、11、2、5

    a[6]<a[7]即2<5,故交换位置,9、10、4、3、14、11、5、2

          由以上比较过程可知,通过7次比较,可以确定最小的数2,并放到末尾。

    同理循环这个过程,经过6次比较可以确定3,数列变为:………3、2

                             经过5次比较可以确定4,数列变为:………4、3、2

                             经过4次比较可以确定5,数列变为:………5、4、3、2

                             经过3次比较可以确定9,数列变为:………9、5、4、3、2

                             经过2次比较可以确定10,数列变为:………10、9、5、4、3、2

                             经过1次比较可以确定11,数列变为:…………11、10、9、5、4、3、2 同时最大的数也就确定了,数列变为14、11、10、9、5、4、3、2

    总结:要比排列出8个数的顺序,要循环7次才能做到,每次循环的比较次数分别为7、6、5、4、3、2、1。

    下面是将8个数从大排列到小的程序代码:

     1 #include<stdio.h>
     2 int main()
     3 {
     4     int arr[8];
     5     int i,j,temp;
     6     for(i=0;i<8;i++)  //利用for循环手动输入8个数,并存放到数组arr[i]
     7        {
     8             printf("请输入第%d个数据:
    ",i+1);
     9         scanf("%d",&arr[i]); 
    10     } 
    11     for(i=0;i<7;i++)   //i从0~6,要经过7次循环才能排出顺序
    12     {
    13         for(j=0;j<7-i;j++)   //7次循环,每次分别比较次数7、6、5、4、3、2、1 
    14         {
    15             if(arr[j]<arr[j+1])      
    16             {
    17                 temp=arr[j];    //交换位置
    18                 arr[j]=arr[j+1];
    19                 arr[j+1]=temp; 
    20             }      
    21         } 
    22     }
    23     printf("由大到小排列为:
    ");   //利用for循环,将数组输出
    24     for(i=0;i<8;i++)
    25     { 
    26         printf("%d ",arr[i]);
    27     } 
    28     return 0; 
    29 } 

    注:若要一组数由小到大排列,将if中的条件语句改变即可,arr[j]>arr[j+1]。

    二、选择排序

    选择排序原理如下,同样以8个数由大到小排列为例,进行说明,数据存放在数组a[8]中。

    假如8个数分别为4、9、10、3、2、14、11、5。第一次以a[0]为定点开始比较。

    a[0]<a[1]即4<9,故交换位置:9、4、10、3、2、14、11、5

    a[0]<a[2]即9<10,故交换位置:10、4、9、3、2、14、11、5

    a[0]>a[3]即10>3,位置不变

    a[0]>a[4]即10>2,位置不变

    a[0]<a[5]即10<14,故交换位置:14、4、9、3、2、10、11、5

    a[0]>a[6]即14>11,位置不变

    a[0]>a[7]即14>5,位置不变

        由以上比较过程可知,通过7次比较,可以确定最大的数2,并放到首位。

    同理循环这个过程,以a[1]为定点,经过6次比较可以确定11,数列变为:14、11………

                             以a[2]为定点, 经过5次比较可以确定10,数列变为:14、11、10………

                             以a[3]为定点,经过4次比较可以确定9,数列变为:14、11、10、9………

                             以a[4]为定点,经过3次比较可以确定5,数列变为:14、11、10、9、5………

                             以a[5]为定点,经过2次比较可以确定4,数列变为:14、11、10、9、5、4………

                            以a[6]为定点, 经过1次比较可以确定3,数列变为:14、11、10、9、5、4、3………… 同时最小的数2也就确定了,数列变为14、11、10、9、5、4、3、2

    总结:要比排列出8个数的顺序,要循环7次才能做到,每次循环的比较次数分别为7、6、5、4、3、2、1

     1 #include<stdio.h>
     2 int main()
     3 {
     4     int arr[8];
     5     int i,j,temp;
     6     for(i=0;i<8;i++)    //利用for循环手动输入8个数,并存到数组arr[i]中
     7     {
     8             printf("请输入第%d个数据:
    ",i+1);
     9         scanf("%d",&arr[i]); 
    10     }
    11     for(i=0;i<7;i++)       //i从0~6,7次循环方能将8个数排列起来
    12     {
    13         for(j=i;j<8;j++)      //7次循环,每次循环比较的次数7、6、5、4、3、2、1
    14         {
    15             if(arr[i]<arr[j])
    16             {
    17                 temp=arr[i];
    18                 arr[i]=arr[j];
    19                 arr[j]=temp; 
    20             } 
    21         } 
    22     }
    23     printf("由大到小排列为:
    "); 
    24     for(i=0;i<8;i++)
    25     { 
    26         printf("%d ",arr[i]);
    27     } 
    28     return 0;  
    29 }

    注:若要一组数由小到大排列,将if中的条件语句改变即可,arr[i]>arr[j]。

    三、插入算法

    在一组有序(由大到小或由小到大排列)的数列中,插入一个数,保持原有顺序。程序代码如下:

     1 #include<stdio.h>
     2 int main()
     3 {
     4     int arr[11]={3,5,6,8,15,17,20,21,45,50,0};
     5     int num;
     6     int i; 
     7     int biaoji=0; //保存找到的下表,默认最小下标 
     8     printf("请输入一个数据:
    ");
     9     scanf("%d",&num);
    10     for(i=0;i<=8;i++)   //循环找到要插入的位置下标 
    11     {
    12         if(num>=arr[i]&&num<=arr[i+1])
    13         {
    14             biaoji=i+1;
    15              break; 
    16          }
    17         if(num>arr[9])
    18         {
    19             biaoji=10;
    20             break; 
    21         } 
    22     }    
    23     for(i=10;i>biaoji;i--)  //把后面的数依次往后移,空出下标位置 
    24     {
    25         arr[i]=arr[i-1]; 
    26     }
    27     arr[biaoji]=num;   //把num的值赋给找到的下标处 
    28     for(i=0;i<11;i++)   //显示结果 
    29     {
    30         printf("%d ",arr[i]); 
    31     } 
    32 
    33     return 0;     
    34 } 
  • 相关阅读:
    poj2352树状数组
    hdu1166树状数组
    poj2785双向搜索
    poj2566尺取变形
    poj2100还是尺取
    poj3061尺取法
    poj3320尺取法
    hdu3829最大独立集
    poj2594最小顶点覆盖+传递闭包
    经典换根dp——hdu2196
  • 原文地址:https://www.cnblogs.com/yddlvo/p/4458280.html
Copyright © 2011-2022 走看看