冒泡排序
重复遍历待排数列中地元素,两两进行比较,如果它们 地顺序错误,就将它们交换位置,一直到最后一个数。
算法思想
在每轮循环中,将相邻的两个树进行比较,如果前面的数大于后面的数,就进行交换,一直到最后排序的位置。
- 总轮数:i=arr.length-1(因为一个数不需要和它自己比较)
- 每一轮需要比较的次数:j=arr.length-1-i(在前面的轮数中已经排好序的数不需要参与后面的比较)
- 两层for循环:
- 第一层:控制比较的轮数
- 第二层:控制在本轮中需要比较的次数
具体分析:
从上面地排序过程看出,第1趟排序完成后,最大值12到了最后面;第2趟排序完成后,次大值9排在了倒数第二位;并且,在第二趟排序中,只需要看12之前地数字。依此类推,直到排完所有地数字,即拍到数组中只有一个待排数字。
代码实现:
import java.util.Arrays;
public class BubbleSort {
public static void main(String[] args){
int[] arr = {8,3,6,9,0,12,7,5};
System.out.println("冒泡排序前:"+Arrays.toString(arr));
bubbleSort(arr);
System.out.println("冒泡排序后:"+Arrays.toString(arr));
}
//冒泡排序方法
public static void bubbleSort(int[] arr){
for(int i = 0;i<arr.length;i++){//控制比较的轮数
for(int j = 0;j<arr.length-1-i;j++){//控制比较的次数
if(arr[j]>arr[j+1]){
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
}
从分析过程中我们看到,在第5趟完成之后,序列已经有序了,第6趟和第7趟已经没必要进行排序。这时,我们可以对冒泡排序进行优化:
添加一个标记,如果一趟排序中发生了交换,则标记为true;没有交换,则标记为false。如果某一趟没有发生交换,则说明排序已经完成,可以退出。
优化后的代码如下:
public static void bubbleSort(int[] arr){
for(int i=1;i<arr.length;i++){
boolean flag = false;//false:没有发生交换;true:发生交换
for(int j=0;j<arr.length-1-i;j++){
if(arr[j]>arr[j+1]){
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
flag = true;
}
}
if(flag==false){//如果没有发生交换,则退出
break;
}
}
}