使用冒泡算法实现 9 8 7 6 5 从小打到大排序
方法一
思路如下:
第一趟: 找出最大的数 9
第一次 8 9 7 6 5 9与8交换
第二次 8 7 9 6 5 9与7交换
第三次 8 7 6 9 5 9与6交换
第四次 8 7 6 5 9 9与5交换
第二趟:找出8
第一次 7 8 6 5 9 8与7交换
第二次 7 6 8 5 9 8与6交换
第三次 7 6 5 8 9 8与5交换
第四次 7 6 5 8 9 8与9交换
第三趟:找出7
第一次 6 7 5 8 9 7与6交换
第二次 6 5 7 8 9 7与5交换
第三次 6 5 7 8 9 7与8交换
第四次 6 5 7 8 9 8与9交换
第四趟:找出6
第一次 5 6 7 8 9 6与5交换
第二次 5 6 7 8 9 6与7交换
第三次 5 6 7 8 9 7与8交换
第四次 5 6 7 8 9 8与9交换
java 代码实现:
package com.bjsxt.sort.bubble;
import java.util.Arrays;
public class BubbleSort1 {
/**
* @param args
*/
public static void main(String[] args) {
int[] arr ={9,8,7,6,5};
sort(arr);
}
public static void sort(int[] arr){
int len =arr.length;
for(int j=0;j<len-1;j++){
System.out.println("第"+(j+1)+"趟");
for(int i=0;i<len-1;i++){
System.out.print("第"+(i+1)+"次");
if(arr[i]>arr[i+1]){
int temp = arr[i];
arr[i] =arr[i+1];
arr[i+1] =temp;
}
System.out.println(Arrays.toString(arr));
}
}
}
}
方法二
方法一中我们可以发现某些交换位置是重复的,比如第二趟的第四次和第三趟的第四次,所以有必要进行优化处理。
第一趟: 找出最大的数 9
第一次 8 9 7 6 5 9与8交换
第二次 8 7 9 6 5 9与7交换
第三次 8 7 6 9 5 9与6交换
第四次 8 7 6 5 9 9与5交换
第二趟:找出8
第一次 7 8 6 5 9 8与7交换
第二次 7 6 8 5 9 8与6交换
第三次 7 6 5 8 9 8与5交换
第三趟:找出7
第一次 6 7 5 8 9 7与6交换
第二次 6 5 7 8 9 7与5交换
第四趟:找出6
第一次 5 6 7 8 9 6与5交换
package com.bjsxt.sort.bubble;
import java.util.Arrays;
public class BubbleSort2 {
/**
* @param args
*/
public static void main(String[] args) {
int[] arr ={9,8,7,6,5};
sort(arr);
}
//第二版本,减少每一趟的次数
public static void sort(int[] arr){
int len =arr.length;
for(int j=0;j<len-1;j++){ //趟数
System.out.println("第"+(j+1)+"趟");
for(int i=0;i<len-1-j;i++){ //次数
System.out.print("第"+(i+1)+"次");
if(arr[i]>arr[i+1]){
int temp = arr[i];
arr[i] =arr[i+1];
arr[i+1] =temp;
}
System.out.println(Arrays.toString(arr));
}
}
}
}
方法三
假设数据已经有序,后者经过某趟后有序 ,减少趟数
如: 8 1 2 3 4
第一趟: 1 2 3 4 8
第二趟: 1 2 3 4 8 没有交换停止循环
package com.bjsxt.sort.bubble;
import java.util.Arrays;
/**
* 最终版本:考虑存在顺序
* @author Administrator
*
*/
public class BubbleSort {
/**
* @param args
*/
public static void main(String[] args) {
int[] arr ={1,2,9,3,4};
sortFinal(arr);
}
//第二版本,减少每一趟的次数
public static void sortFinal(int[] arr){
boolean sorted= true;
int len =arr.length;
for(int j=0;j<len-1;j++){ //趟数
sorted =true; //假定有序
for(int i=0;i<len-1-j;i++){ //次数
if(arr[i]>arr[i+1]){
int temp = arr[i];
arr[i] =arr[i+1];
arr[i+1] =temp;
sorted =false; //假定失败
}
System.out.println(Arrays.toString(arr));
}
if(sorted){ //减少趟数
break;
}
}
}
}