------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培训、期待与您交流! -------