java 排序算法(冒泡)

最近想把排序算法重新复习下,顺便理理思路。

首先冒泡排序。

说白了,冒泡排序就是一对对的比较,然后swap,在思路上来说没啥子其他的了。

不过在实现的时候可以发现,外循环其实每循环一次都可以减少一次,因为第一次外循环的时候 冒泡排序把最大的数移动到了最后面,第二次循环的时候也是把第二大的数移到

倒数第二个位置…………依次可以减少下内循环的次数。

看一个最直观的代码(最直观也就最可能是最差的代码)

	public int[] bubble(int[] arr){
		int temp;
		int h=0;
		for(int j=0; j< arr.length; j++){
			h++;
			for(int i=0; i< arr.length-1; i++){
				if(arr[i] > arr[i+1]){
					temp = arr[i+1];
					arr[i+1] = arr[i];
					arr[i] = temp;
				}
			}
		}
		return arr;
	}

 下面简略的测试下时间消耗 

	public static void main(String[] args) {
		TestBubble bubble = new TestBubble();
		int[] arry = new int[10000];
		for(int i=9999; i>=0; i--){
			arry[i] = 9999-i;
		}
		long startTime = System.currentTimeMillis();//毫秒
		bubble.bubble(arry);
		long endTime = System.currentTimeMillis();
		System.out.println("Time:"+(endTime-startTime)+"ms");
	}


稍微修改下代码,把第二个for循环中的arr.length-1改为-h

			for(int i=0; i< arr.length-h; i++){
消耗时间如下:

代码再稍微改一点:如下

	public int[]  bubbleSort(int[] arr) {
	      boolean swapped = true;
	      int j = 0;
	      int tmp;
	      while (swapped) {
	            swapped = false;
	            j++;
	            for (int i = 0; i < arr.length - j; i++) {                                       
	                  if (arr[i] > arr[i + 1]) {                          
	                        tmp = arr[i];
	                        arr[i] = arr[i + 1];
	                        arr[i + 1] = tmp;
	                        swapped = true;
	                  }
	            }                
	      }
	      return arr;
	}
运行时间如下:

我以为出了问题,把时间改成System.nanoTime()纳秒

结果如下:

我特地百度了下,纳秒和毫秒的关系1s=1000ms=1000000微秒=1000000000纳秒=1000000000000皮秒
这个速度就更好了点,具体原因没想出来,for循环变成了while,缺少了arr.length,还有i++的过程,这个差距也有点猛哦。

当然我这个初始化的数组也有点坑的感觉,完全是相反的,哈哈。

冒泡排序花费的时间与初始化的数据顺序还是具有很大关系的。

同时在冒泡排序中有个说法,就是乌龟和兔子。

乌龟指的就是冒泡排序中小的数走的特别慢,兔子指的是大数据走的特别快,看下面两个图就很明显了


上图是小数也就是乌龟数。


上图是大数也就是兔子数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值