Bubble Sort 优化

package com.test;
import java.util.Arrays;

public class testBubbleSort {
	
private static void sort(int array[]){
	int tmp  = 0;
	for(int i = 0; i < array.length; i++){
	        for(int j = 0; j < array.length - i - 1; j++){
	            if(array[j] > array[j+1]){
	                tmp = array[j];
	                array[j] = array[j+1];
	                array[j+1] = tmp;
	            }
	        }
	    }
	}

	public static void main(String[] args){
	    int[] array = new int[]{5,8,6,3,9,2,1,7};
	    sort(array);
	    System.out.println(Arrays.toString(array));
	}
}

优化第一版:

//如果我们能判断出数列已经有序,并且做出标记,剩下的几轮排序就可以不必执行,提早结束工作。
//如果在本轮排序中,元素有交换,则说明数列无序;如果没有元素交换,说明数列已然有序,直接跳出大循环。

package com.test;
import java.util.Arrays;
public class testBubbleSort {

		private static void sort(int array[]){
		    int tmp  = 0;
		    for(int i = 0; i < array.length; i++){
		        //有序标记,每一轮的初始是true
		        boolean isSorted = true;
		        for(int j = 0; j < array.length - i - 1; j++){
		            if(array[j] > array[j+1]){
		                tmp = array[j];
		                array[j] = array[j+1];
		                array[j+1] = tmp;
		                //有元素交换,所以不是有序,标记变为false
		                isSorted = false;
		            }
		        }
		        if(isSorted){
		            break;
		        }
		    }
		}

		public static void main(String[] args){
		    int[] array = new int[]{5,8,6,3,9,2,1,7};
		    sort(array);
		    System.out.println(Arrays.toString(array));
		}
	}

优化第二版: 

// 这一版代码中,sortBorder就是无序数列的边界。每一轮排序过程中,sortBorder之后的元素就完全不需要比较了,肯定是有序的。

package com.test;
import java.util.Arrays;

public class testBubbleSort {
	private static void sort(int array[]){
	   int tmp  = 0;
	   //记录最后一次交换的位置
	   int lastExchangeIndex = 0;
	   //无序数列的边界,每次比较只需要比到这里为止
	   int sortBorder = array.length - 1;
	    for(int i = 0; i < array.length; i++){
	        //有序标记,每一轮的初始是true
	        boolean isSorted = true;
	        for(int j = 0; j < sortBorder; j++){
	            if(array[j] > array[j+1]){
	                tmp = array[j];
	                array[j] = array[j+1];
	                array[j+1] = tmp;
	                //有元素交换,所以不是有序,标记变为false
	                isSorted = false;
	                //把无序数列的边界更新为最后一次交换元素的位置
	                lastExchangeIndex = j;
	            }
	        }
	        sortBorder = lastExchangeIndex;
	        if(isSorted){
	            break;
	        }
	    }
	}
	
	public static void main(String[] args){
	    int[] array = new int[]{3,4,2,1,5,6,7,8};
	    //System.out.println("array[] :" + Arrays.toString(array));
	    sort(array);
	    System.out.println(Arrays.toString(array));
	}
}

参考文章:https://blog.csdn.net/csdnnews/article/details/81187659

猜你喜欢

转载自blog.csdn.net/Cxy_357/article/details/81292955