排序算法之冒泡排序

       冒泡算法的核心思想就是:相邻的两个一一比较,如果前一个大,就将两个交换。(这里假定我们是按从小到大的顺序)

  根据这个思想写了以下四个实现方法:
    1.bubbleSort1:考虑了边界条件,然后就是暴力比较了。

public static void bubbleSort1(int[] arr){
	          if (arr == null || arr.length < 2 ){
	               return ;
	           }
	          int length = arr.length;
	          int temp = 0;
	          for (int i =0; i < length-1; i++){
	              for (int j = 0; j < length-1; j++){
	                if (arr[j] > arr[j+1]){
	                     temp = arr[j];
	                     arr[j] = arr[j+1];
	                     arr[j+1] = temp;
	                }
	             }
	           }
	          }

   2.bubbleSortImp:bubbleSort1的改进版,考虑到提前排好序的情况,只要在某一轮比较中没有发生交换,那么就确定该序列已经提前排好序了,因此设立了一个判断条件。

public static void bubbleSortImp(int[] arr){
	    	if (arr == null || arr.length <2){
	    		return;
	    	}
	    	int temp = 0;
	    	
	    	for(int i = 0; i < arr.length-1; i++){
	    		boolean change = false;
	    		for(int j = 0; j < arr.length-1;j++){
	    			if(arr[j] > arr[j+1]){
	    				temp = arr[j];
	    				arr[j] = arr[j+1];
	    				arr[j+1] = temp;
	    				change = true;
	    			}
	    		}
	    		if(!change){
	    			break;
	    		}
	    	}  
	      }                

      3.bubbleSortReverse:bubbleSortImp的逆序版

public static void bubbleSortReverse(int[] arr){
			   if(arr == null || arr.length < 2){
				   return;
			   }
			   
			   int temp = 0;
			   for (int i = 0; i < arr.length-1; i++){
			       boolean isChange = false;
				   for (int j = 0; j < arr.length-1; j++){
					   if(arr[j] < arr[j+1]){
						   temp = arr[j];
						   arr[j] = arr[j+1];
						   arr[j+1] = temp;
						   isChange = true;
					   }
				   }
				   if(!isChange){
					   break;
				   }
			   }
		   }

     4.bubbleSortMax:bubbleSortImp的升级版,考虑到第一轮确定了最大的数放在最右边,因此我们在比较的时候就可以省去跟它比较了。第二轮确定的是次大的数,在最大数的左边,那么我们也不用再去比较了。因此在比较(内循环)的时候,j的边界值是逐渐递减的,递减的值大小与i的大小相等。

public static void bubbleSortMax (int[] arr){
	    	  if (arr == null || arr.length < 2){
	    		  return;
	    	  }
	    	  
	    	  int temp = 0;
	    	  
	    	  for(int i = 0; i < arr.length -1; i++){
	    		  boolean isChange = false;
	    		  for(int j = 0; j < arr.length -1 -i; j++){
	    			  if (arr[j] > arr[j+1]){
	    				  temp = arr[j];
	    				  arr[j] = arr[j+1];
	    				  arr[j+1] = temp;
	    				  isChange = true;
	    			  }
	    		  }
	    		  if(!isChange){
	    			  break;
	    		  }
	    	  }
	      }             

     5.bubbleSortMaxPlus:bubbleSortMax的升级版。将是否需要再循环的判断直接放到for语句中,代码更加的整洁简单,逻辑清晰。

 public static void bubbleSortMaxPlus (int[] arr){
	    	  if (arr == null || arr.length < 2){
	    		  return;
	    	  }
	    	  
	    	  int temp = 0;
	    	  boolean needNextPass = true;
	    	  for(int i = 0; i < arr.length -1 && needNextPass; i++){
	    		          needNextPass = false;
	    		  for(int j = 0; j < arr.length -1 -i; j++){
	    			  if (arr[j] > arr[j+1]){
	    				  temp = arr[j];
	    				  arr[j] = arr[j+1];
	    				  arr[j+1] = temp;
	    				  needNextPass = true;
	    			  }
	    		  }
	    	  }
	      }

  


                      

posted on 2017-11-16 13:19  取个名字真的很难  阅读(560)  评论(0编辑  收藏  举报

导航