Java实现冒泡排序—详细解析优化版

# Java实现冒泡排序—详细解析优化版冒泡
思想:冒泡排序是一种简单的排序算法。它***重复地走访过要排序的数列***,一次比较两个相邻元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是***重复地进行***直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

  1. 时间复杂度:最优时间复杂度,最差时间复杂度分析和平均时间复杂度均为 O(n^2),主要的推算公式示通过等差数列s=n(n-1)/2;
  2. 空间复杂度:空间复杂度就是在交换元素时那个临时变量所占的内存空间;
    最优的空间复杂度就是开始元素顺序已经排好了,则空间复杂度为:0;
    最差的空间复杂度就是开始元素逆序排序了,则空间复杂度为:O(n);
    平均的空间复杂度为:O(1);

代码块

 public void getResult(int[] arr){
    	 boolean flag;
    	 for(int i=0;i<arr.length-1;i++)
    	 {
    		 flag=false;
    		 for(int j=0;j<arr.length-i-1;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;
    		 }
    	   }
     }

结果
这里写图片描述
分析:
1. 假设初始化数组为int[] array={33,27,56,98,70}
当外循环i=0时,内循环j=0时 此时 array={27,33,56,98,70}

当外循环i=0时,内循环j=3时 此时array={27,33,56,70,98}已经完全排好序;比一起一般的排序方法本程序增加了一个标志位boolean flag,这样就大大减少循环次数,提高程序执行效率;
2.1.当i=0的时候内循环j经过4次循环,已经排好序;当i=时,标志位flag重置为false,但内循环已经不需要再次排序换位了,所以直接break 跳出;
2.冒泡排序思路(第一层)是先从第一个数开始冒泡(对应数组中的a[0]的值),然后与第二个数进行比较(对应数组中的a[1]的值)。
a.假如a[0]>a[1],则a[0]与a[1]交换位置。小的值放在前面,大的值放在后面。也就说a[1]的位置现在放在第一位了,而a[0]的放在在第二位,但是a[0]继续与后面的数值进行比较。道理和a[0]与a[1]的过程一样。直到找出该数组的最大的值。并把这个最大值放在最后面的位置。第一层排序结束。

 b.假如a[0]<a[1],则a[0]与a[1]不交换位置。第一个if条件没有执行。然后j++,然后变成a[1]与它相邻的右边的a[2]进行比较,以次类推,直到第一层排序结束,并把最大的值冒泡到最尾的位置。

3.难点:1.外循环控制循环的次数,若初始化以0开始就至n-1;若初始化以1开始就至n;建议一般初始化以0开始,因为数组的下标就是以0开始;
2.内循环控制交换的次数,当i=0第一次循环结束后就把最大那位数已经冒出来,所以当i=1时,内循环需要n-i-1,即不用和最大那位数重复比较;随着i值的增大,循环的次数越来越少;

算法初学者,以上分析参考了网上一些博客,根据自己总结写出来的,如有异议请勿喷,欢迎指正;

猜你喜欢

转载自blog.csdn.net/yjwen12/article/details/78106520