• 排序04冒泡排序


    一)定义

    将被排序的记录数组R[1..n]垂直排列,每个记录R[i]看作是重量为R[i].key的气泡。根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R:凡扫描到违反本原则的轻气泡,就使其向上"飘浮"。如此反复进行,直到最后任何两个气泡都是轻者在上,重者在下为止。

    冒泡排序属于交换排序,交换排序主要是根据记录的关键字的大小,将记录交换来进行排序的。交换排序的特点是:将关键字值较大的记录向序列的后部移动,关键字较小的记录向前移动。交换排序方法包括冒泡排序和快速排序。

    二)冒泡排序的实现(java)

    package com.fox;
    
    import java.util.Random;
    
    public class BubbleSort {
    
    	public static void sort(int[] a) {
    		for (int i = 0; i < a.length - 1; i++) {
    			for (int j = 0; j < a.length - 1 - i; j++) {
    				if (a[j] > a[j + 1]) {
    					int temp = a[j];
    					a[j] = a[j + 1];
    					a[j + 1] = temp;
    				}
    			}
    		}
    	}
    
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		int[] a = new int[100000];
    		Random random = new Random();
    		for (int i = 0; i < a.length; i++) {
    			a[i] = random.nextInt(100000);
    		}
    		// a = new int[] { 6, 7, 51, 2, 52, 8 };
    		long bt = System.currentTimeMillis();
    		BubbleSort.sort(a);
    		System.out.println(System.currentTimeMillis() - bt);
    		// for (int a_ : a)
    		// System.out.println(a_);
    
    	}
    
    }
    

      

    该算法的时间复杂度为O(n2)。上面的算法还可以做出一定优化,就是第二层循环内如果没有进行交换,则说明已经全部有序,可以直接退出。

    public static void sort(int[] a) {
    		for (int i = 0; i < a.length - 1; i++) {
    			int flag = 0;
    			for (int j = 0; j < a.length - 1 - i; j++) {
    				if (a[j] > a[j + 1]) {
    					int temp = a[j];
    					a[j] = a[j + 1];
    					a[j + 1] = temp;
    					flag++;
    				}
    			}
    			if (flag == 0)
    				break;
    		}
    	}
    

    在极端情况下,待排序数组本来就有序(升序),那么改进后的算法时间复杂度为O(n)。

  • 相关阅读:
    宋词:一剪梅,雨打梨花深闭门。唐寅
    算法整理之动态规划
    与君相恋100次
    死循环之----恐怖游轮
    IOS 霓虹灯效果
    IOS 在viewController上添加视频
    iOS UIImagePickerController拍照与摄像
    socket开发基础
    RunLoop 原理和核心机制
    Objective-C的Runtime System
  • 原文地址:https://www.cnblogs.com/huangfox/p/2569292.html
Copyright © 2020-2023  润新知