主要内容是摘自别人的,但是发现示例代码有错,故内容复制,代码修改。
原理:临近的数字两两进行比较,按照从小到大(从大到小)进行交换,这样一趟过去后,最大或最小的数字被交换到了最后一位;
然后再从头开始进行两两比较交换,直到倒数第二位时结束(因为由第一遍排序得知已经把最大(小)数排到末尾了);
接着再从头开始进行两两比较交换,直到倒数第三位时结束(因为由第一遍排序得知已经把最大(小)数排到末尾了,第二遍把第二大(小)的数排到倒数第二位了);
循环直到排完序。
例子为从小到大排序,
原始待排序数组| 6 | 2 | 4 | 1 | 5 | 9 |
第一趟排序(外循环)
第一次两两比较6 > 2交换(内循环)
交换前状态| 6 | 2 | 4 | 1 | 5 | 9 |
交换后状态| 2 | 6 | 4 | 1 | 5 | 9 |
第二次两两比较,6 > 4交换
交换前状态| 2 | 6 | 4 | 1 | 5 | 9 |
交换后状态| 2 | 4 | 6 | 1 | 5 | 9 |
第三次两两比较,6 > 1交换
交换前状态| 2 | 4 | 6 | 1 | 5 | 9 |
交换后状态| 2 | 4 | 1 | 6 | 5 | 9 |
第四次两两比较,6 > 5交换
交换前状态| 2 | 4 | 1 | 6 | 5 | 9 |
交换后状态| 2 | 4 | 1 | 5 | 6 | 9 |
第五次两两比较,6 < 9不交换
交换前状态| 2 | 4 | 1 | 5 | 6 | 9 |
交换后状态| 2 | 4 | 1 | 5 | 6 | 9 |
第二趟排序(外循环)
第一次两两比较2 < 4不交换
交换前状态| 2 | 4 | 1 | 5 | 6 | 9 |(已经知道最大)
交换后状态| 2 | 4 | 1 | 5 | 6 | 9 |
第二次两两比较,4 > 1交换
交换前状态| 2 | 4 | 1 | 5 | 6 | 9 |
交换后状态| 2 | 1 | 4 | 5 | 6 | 9 |
第三次两两比较,4 < 5不交换
交换前状态| 2 | 1 | 4 | 5 | 6 | 9 |
交换后状态| 2 | 1 | 4 | 5 | 6 | 9 |
第四次两两比较,5 < 6不交换
交换前状态| 2 | 1 | 4 | 5 | 6 | 9 |
交换后状态| 2 | 1 | 4 | 5 | 6 | 9 |
第三趟排序(外循环)
第一次两两比较2 > 1交换
交换前状态| 2 | 1 | 4 | 5 | 6 | 9 |
交换后状态| 1 | 2 | 4 | 5 | 6 | 9 |
第二次两两比较,2 < 4不交换
交换前状态| 1 | 2 | 4 | 5 | 6 | 9 |
交换后状态| 1 | 2 | 4 | 5 | 6 | 9 |
第三次两两比较,4 < 5不交换
交换前状态| 1 | 2 | 4 | 5 | 6 | 9 |
交换后状态| 1 | 2 | 4 | 5 | 6 | 9 |
第四趟排序(外循环)无交换
第一次两两比较1<2不交换
交换后状态| 1 | 2 | 4 | 5 | 6 | 9 |
第一次两两比较2<4不交换
交换后状态| 1 | 2 | 4 | 5 | 6 | 9 |
第五趟排序(外循环)无交换
第一次两两比较1<2不交换
交换后状态| 1 | 2 | 4 | 5 | 6 | 9 |
原:| 1 | 2 | 4 | 5 | 6 | 9 |
一:| 1 | 2 | 4 | 5 | 6 | 9 |
二:| 1 | 2 | 4 | 5 | 6 | 9 |
三:| 1 | 2 | 4 | 5 | 6 | 9 |
四:| 1 | 2 | 4 | 5 | 6 | 9 |
五:| 1 | 2 | 4 | 5 | 6 | 9 |
排序完毕,输出最终结果1 2 4 5 6 9
1 /* 2 By starainDou 3 */ 4 public class Hello { 5 public static void main(String args[]){ 6 int []num = {6,2,4,1,5,9}; 7 for(int i = 0;i<num.length - 1;i++){ 8 for(int j = 0; j<num.length-1-i;j++){ 9 if(num[j]>num[j+1]){ 10 int temp = num[j]; 11 num[j] = num[j+1]; 12 num[j+1] = temp; 13 } 14 } 15 } 16 for(int n = 0; n < num.length; n ++){ 17 System.out.print(num[n]+"\t"); 18 } 19 } 20 }
在此感谢原作者