黑马程序员——冒泡排序和选择排序——熟悉又陌生的排序方法

时间:2023-01-24 22:11:44

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

 

  昨天做基础测试题,遇到了个排序问题,写完后脑子里突然跳出了“冒泡排序法”这个名词。“冒泡排序法”和“选择排序法”是每个程序初学者都会学到的两个排序方法,但是好多人对这两个排序方法是既熟悉又陌生,熟悉是因为凡是遇到排序一般都会想到这两个方法,陌生是因为细细一想对这两个方法的原理和区别又不是很清楚。不较真还好,初学者一较真就很容易被这两个方法搞晕了,我当时也被这两个方法搞晕了,就又认认真真一步一步的分析了一遍这两个方法,并进行了总结。好了,废话不多说了,先上代码:

  将1,2,3,4,5,6,7,8,9按照从大到小排列出来。

1、冒泡排序

 1 #include <stdio.h>
 2 
 3 int main()
 4 {
 5     int arry[9] = {1,2,3,4,5,6,7,8,9};
 6     int tem = 0;
 7 
 8     for(int i=0; i<8; i++)                          //  控制排序时的趟数
 9     {
10         for(int j=0; j<8-i; j++)                //  控制每一趟排序的下标
11         {
12             if(arry[j]<arry[j+1])
13             {
14                 tem = arry[j];
15                 arry[j] = arry[j+1];
16                 arry[j+1] = tem;
17             }
18         }
19     }
20 
21     printf("数组元素从大到小排列为:\n");
22     for(int i=0; i<9; i++)
23     {
24         printf("%d\n", arry[i]);
25     }
26     return 0;
27 }


2、选择排序

 1 #include <stdio.h>
 2 
 3 int main()
 4 {
 5     int arry[9] = {1,2,3,4,5,6,7,8,9};
 6     int tem = 0;
 7 
 8     for(int i=0; i<8; i++)                      //  控制趟数
 9     {
10         for(int j=i+1; j<9; j++)            //  控制每趟里的次数
11         {
12             if(arry[i]<arry[j])
13             {
14                 tem = arry[i];
15                 arry[i] = arry[j];
16                 arry[j] = tem;
17             }
18         }
19     }
20 
21     printf("数组元素从大到小排列为:\n");
22     for(int i=0; i<9; i++)
23     {
24         printf("%d\n", arry[i]);
25     }
26     return 0;
27 }

总结:
1、冒泡排序:如上边的例子所示,

  第零趟,将第0个和第1个位置的进行比较,若第0个小于第1个,则交换他们的位置;再将第1个与第2个位置的进行比较,若第1个小于第2个,则交换他们的位置;…… 将第7个与第8个位置的进行比较,若第7个小于第8个,则交换他们的位置;此时第零趟比较完成,且所有数字中最小的数字已经处于最末位。所以下一趟就不用比较最后一个位置的值了。

  第一趟,将第0个和第1个位置的进行比较,若第0个小于第1个,则交换他们的位置;再将第1个与第2个位置的进行比较,若第1个小于第2个,则交换他们的位置;…… 将第6个与第7个位置的进行比较,若第6个小于第7个,则交换他们的位置;此时第一趟比较完成,且所有数字中第二小的数字已经处于倒数第二位。所以下一趟就不用比较最后两个位置的值了。

  ……

  第七趟,将第0个和第一个位置的进行比较,若第0个小于第1个,则交换他们的位置;此时后边7个位置的值已经按从大到小排列好了,所以不用在比较。

2、选择排序:如上边的例子所示,

  当i=0时,将第0个位置的值与后边每个位置的值进行比较,若第0个位置的值小于该位置的值,则交换他们的位置;当与最后一个位置的之比较完之后,此时所有的值中最大的值已经处于第0个位置。

  同理,当i=1是,比较完后,第二大的值已经处于第1个位置。

  ……

  当i=7时,比较完后,所有的值已经按从大到小排列好了。

3、冒泡排序和选择排序区别在于:

  冒泡排序是两两进行比较,然后一趟一趟的循环,直到排好序为止(在例子中表现为最小的值先确定位置,依次排列,直到最大的值最后确定位置);

  选择排序是从数的第一个位置开始依次和后面的数进行比较(在例子中表现为最大的值先确定位置,依次排列,直到最小的值最后确定位置)。

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------