冒泡排序

情景:对数组 int[] arr = {6,9,5,2,8,7}中的数据 从小到大排序

思路:从下标为0开始比较,如果arr[0] > arr[1],则交换;否则,不做任何处理。然后同理比较arr[1]和arr[2],,,arr[maxSize-2]和arr[maxSize-1]。经过一轮比较,最大的数据排到最右侧,也就是maxSize-1的位置,此数据自此不再参与比较。接下来进行第二轮比较,也是从下表为0开始比较,一直比较到arr[maxSize-2]。同理,进行第三轮,第四轮,直至结束。注意,红色数字表示已排序。

第一轮排序后:6 5 2 8 7 9

第二轮排序后:5 2 6 7 8 9

第三轮排序后:2 5 6 7 8 9 

第四轮排序后:2 5 6 7 8 9 

第五轮排序后:2 5 6 7 8 9 

代码:

/**
 * 冒泡排序
 * @author D N
 *
 */
public class BubbleSort {
    private long[] a; 
    private int nElems;
    
    public BubbleSort(int max){
        a = new long[max];
        nElems = 0;
    }    
    
    public void insert(long value){
        a[nElems] = value;
        nElems++;
    }
    
    public void display(){
        for(int j=0;j<nElems;j++){
            System.out.print(a[j]+"   ");
        }
        System.out.println("");
    }
    // 交换两个对象
    public void swap(int one,int two){
        long temp = a[one];
        a[one] = a[two];
        a[two] = temp;
    }
    
    //冒泡排序算法 核心逻辑
    public void bubbleSort(){
        int in,out;
        for(out = nElems-1;out > 1;out--){
            for(in = 0;in < out;in++){
                if(a[in] > a[in+1]){
                    swap(in, in+1);
                }
            }
        }
    }
    
}

运行测试代码:

public class SortTest {
    public static void main(String[] args) {
        int maxSize = 10;
        BubbleSort arr = new BubbleSort(maxSize);
        arr.insert(88);
        arr.insert(99);
        arr.insert(22);
        arr.insert(66);
        arr.insert(33);
        arr.insert(77);
        arr.insert(11);
        arr.insert(44);
        arr.insert(55);
        arr.display();
        arr.bubbleSort();
        arr.display();
    }
}

运行结果:

88 99 22 66 33 77 11 44 55
11 22 33 44 55 66 77 88 99

效率分析:

一般来说,如果数组中有N个数据,那么在第一轮排序中会有N-1次比较,第二轮排序中会有N-2次比较。以此类推,所以大约进行了N2/2次比较,如果数据是随机的,大约会有N2/4次交换。比较和交换次数都和N2成正比所以,其时间复杂度为O(n2)。

 

posted @ 2019-01-22 17:05  51life  阅读(...)  评论(... 编辑 收藏