数据结构与算法(6)-冒泡排序,选择排序,插入排序

时间:2021-04-17 22:09:33

1.冒泡排序

相邻两个节点从左至右两两比较,将大的移至最右端.

数据结构与算法(6)-冒泡排序,选择排序,插入排序


  • 冒泡排序的效率

比较O(N的平方),交换O(N的平方)


  • 代码示例
public class BubbleSort {
    private int[] array = new int[10];
    private int compareCount = 0;
    private int swapCount = 0;
    
    //比较,交换
    public void swap(int x,int y){
        System.out.println("array["+x+"]和array["+y+"]进行比较!!!");
        ++this.compareCount;
        if(array[x] > array[y]){
            System.out.println("    进行交换!!!");
            int temp = array[x];
            array[x] = array[y];
            array[y] = temp;
            ++this.swapCount;
        }
    }
    
    //排序
    public void bubbleSort(){
        //外层循环控制最后一次比较左边元素位置
        for(int out = this.array.length-2; out >= 0; out--){    
            System.out.println("==============");
            //内层循环控制每次比较向右移动一次
            for(int j = 0; j <= out; j++){
                swap(j,j+1);
            }
        }
        System.out.println("排序完成,共"+this.compareCount+"次比较,"+this.swapCount+"次交换!!!");
    }
    
    public static void main(String[] args) {
        BubbleSort bs = new BubbleSort();
        bs.array[0] = 20;
        bs.array[1] = 46;
        bs.array[2] = 19;
        bs.array[3] = 11;
        bs.array[4] = 13;
        bs.array[5] = 9;
        bs.array[6] = 8;
        bs.array[7] = 67;
        bs.array[8] = 25;
        bs.array[9] = 2;
        
        System.out.println(Arrays.toString(bs.array));
        bs.bubbleSort();
        System.out.println(Arrays.toString(bs.array));
    }
}

输出:

[20, 46, 19, 11, 13, 9, 8, 67, 25, 2]
==============
array[0]和array[1]进行比较!!!
array[1]和array[2]进行比较!!!
    进行交换!!!
array[2]和array[3]进行比较!!!
    进行交换!!!
array[3]和array[4]进行比较!!!
    进行交换!!!
array[4]和array[5]进行比较!!!
    进行交换!!!
array[5]和array[6]进行比较!!!
    进行交换!!!
array[6]和array[7]进行比较!!!
array[7]和array[8]进行比较!!!
    进行交换!!!
array[8]和array[9]进行比较!!!
    进行交换!!!
==============
array[0]和array[1]进行比较!!!
    进行交换!!!
array[1]和array[2]进行比较!!!
    进行交换!!!
array[2]和array[3]进行比较!!!
    进行交换!!!
array[3]和array[4]进行比较!!!
    进行交换!!!
array[4]和array[5]进行比较!!!
    进行交换!!!
array[5]和array[6]进行比较!!!
array[6]和array[7]进行比较!!!
    进行交换!!!
array[7]和array[8]进行比较!!!
    进行交换!!!
==============
array[0]和array[1]进行比较!!!
    进行交换!!!
array[1]和array[2]进行比较!!!
    进行交换!!!
array[2]和array[3]进行比较!!!
    进行交换!!!
array[3]和array[4]进行比较!!!
    进行交换!!!
array[4]和array[5]进行比较!!!
array[5]和array[6]进行比较!!!
array[6]和array[7]进行比较!!!
    进行交换!!!
==============
array[0]和array[1]进行比较!!!
array[1]和array[2]进行比较!!!
    进行交换!!!
array[2]和array[3]进行比较!!!
    进行交换!!!
array[3]和array[4]进行比较!!!
array[4]和array[5]进行比较!!!
array[5]和array[6]进行比较!!!
    进行交换!!!
==============
array[0]和array[1]进行比较!!!
    进行交换!!!
array[1]和array[2]进行比较!!!
    进行交换!!!
array[2]和array[3]进行比较!!!
array[3]和array[4]进行比较!!!
array[4]和array[5]进行比较!!!
    进行交换!!!
==============
array[0]和array[1]进行比较!!!
    进行交换!!!
array[1]和array[2]进行比较!!!
array[2]和array[3]进行比较!!!
array[3]和array[4]进行比较!!!
    进行交换!!!
==============
array[0]和array[1]进行比较!!!
array[1]和array[2]进行比较!!!
array[2]和array[3]进行比较!!!
    进行交换!!!
==============
array[0]和array[1]进行比较!!!
array[1]和array[2]进行比较!!!
    进行交换!!!
==============
array[0]和array[1]进行比较!!!
    进行交换!!!
排序完成,共45次比较,30次交换!!!
[2, 8, 9, 11, 13, 19, 20, 25, 46, 67]

2.选择排序

从左至有依次找出最小的,放置在最左边.

数据结构与算法(6)-冒泡排序,选择排序,插入排序


  • 选择排序的效率

比较:O(N的平方),交换O(N)


  • 代码示例
//将每次找到的最小值依次放在0,1,2...
public class SelectSort {
    private int[] array = new int[10];
    private int compareCount = 0;   //比较次数
    private int swapCount = 0;  //交换次数
    
    
    public void selectSort(){
        int min;//最小值的下标
        //第一层循环控制每次最小值放置的位置
        for(int i=0; i<= this.array.length-2; i++){
            System.out.println("============");
            min = i;
            //第二层循环控制每次比较左边值的移动
            for(int j=i+1; j<=this.array.length-1;j++){
                ++this.compareCount;
                System.out.println("array["+j+"]和array["+i+"]进行比较!!!");
                if(this.array[j] < this.array[min]){
                    min = j;
                }
            }
            
            if(min!=i){
                swap(i,min);
                System.out.println("    进行交换!!!");
            }
        }
        System.out.println("排序完成,共"+this.compareCount+"次比较,"+this.swapCount+"次交换!!!");

    }
    
    public void swap(int x,int y){
        ++this.swapCount;
        
        int temp = this.array[x];
        this.array[x] = this.array[y];
        this.array[y] = temp;
    }
    
    public static void main(String[] args) {
        SelectSort ss = new SelectSort();
        ss.array[0] = 20;
        ss.array[1] = 46;
        ss.array[2] = 19;
        ss.array[3] = 11;
        ss.array[4] = 13;
        ss.array[5] = 9;
        ss.array[6] = 8;
        ss.array[7] = 67;
        ss.array[8] = 25;
        ss.array[9] = 2;
        
        System.out.println(Arrays.toString(ss.array));
        ss.selectSort();
        System.out.println(Arrays.toString(ss.array));

    }
}

输出:

[20, 46, 19, 11, 13, 9, 8, 67, 25, 2]
============
array[1]和array[0]进行比较!!!
array[2]和array[0]进行比较!!!
array[3]和array[0]进行比较!!!
array[4]和array[0]进行比较!!!
array[5]和array[0]进行比较!!!
array[6]和array[0]进行比较!!!
array[7]和array[0]进行比较!!!
array[8]和array[0]进行比较!!!
array[9]和array[0]进行比较!!!
    进行交换!!!
============
array[2]和array[1]进行比较!!!
array[3]和array[1]进行比较!!!
array[4]和array[1]进行比较!!!
array[5]和array[1]进行比较!!!
array[6]和array[1]进行比较!!!
array[7]和array[1]进行比较!!!
array[8]和array[1]进行比较!!!
array[9]和array[1]进行比较!!!
    进行交换!!!
============
array[3]和array[2]进行比较!!!
array[4]和array[2]进行比较!!!
array[5]和array[2]进行比较!!!
array[6]和array[2]进行比较!!!
array[7]和array[2]进行比较!!!
array[8]和array[2]进行比较!!!
array[9]和array[2]进行比较!!!
    进行交换!!!
============
array[4]和array[3]进行比较!!!
array[5]和array[3]进行比较!!!
array[6]和array[3]进行比较!!!
array[7]和array[3]进行比较!!!
array[8]和array[3]进行比较!!!
array[9]和array[3]进行比较!!!
============
array[5]和array[4]进行比较!!!
array[6]和array[4]进行比较!!!
array[7]和array[4]进行比较!!!
array[8]和array[4]进行比较!!!
array[9]和array[4]进行比较!!!
============
array[6]和array[5]进行比较!!!
array[7]和array[5]进行比较!!!
array[8]和array[5]进行比较!!!
array[9]和array[5]进行比较!!!
============
array[7]和array[6]进行比较!!!
array[8]和array[6]进行比较!!!
array[9]和array[6]进行比较!!!
    进行交换!!!
============
array[8]和array[7]进行比较!!!
array[9]和array[7]进行比较!!!
    进行交换!!!
============
array[9]和array[8]进行比较!!!
    进行交换!!!
排序完成,共45次比较,6次交换!!!
[2, 8, 9, 11, 13, 19, 20, 25, 46, 67]

3.插入排序

从左至右,依次将右边的节点拿到左边排序好,让左边形成局部排好序的状态.

数据结构与算法(6)-冒泡排序,选择排序,插入排序


  • 插入排序的效率

仍需要O(N)的时间,但一般比冒泡排序和选择排序更快.


  • 代码示例
public class InsertSort {
    private int[] array = new int[10];
    private static int moveCount = 0;
    private static int compareCount = 0;
    
    //插入排序
    public void insertSort(){
        for(int out = 1;out <= array.length-1;out++){
            int temp = array[out];
            int in = out;
            while(in >=1 && array[in-1] >= temp){
                ++compareCount;
                array[in] = array[in-1];
                ++moveCount;
                --in;
            }
            array[in] = temp;
            ++moveCount;
        }
    }
    
    public static void main(String[] args) {
        InsertSort is = new InsertSort();
        is.array[0] = 20;
        is.array[1] = 46;
        is.array[2] = 19;
        is.array[3] = 11;
        is.array[4] = 13;
        is.array[5] = 9;
        is.array[6] = 8;
        is.array[7] = 67;
        is.array[8] = 25;
        is.array[9] = 2;
        
        System.out.println(Arrays.toString(is.array));
        is.insertSort();
        System.out.println(Arrays.toString(is.array));
        System.out.println("moveCount="+moveCount+",compareCount="+compareCount);
        
    }
}

输出:

[20, 46, 19, 11, 13, 9, 8, 67, 25, 2]
[2, 8, 9, 11, 13, 19, 20, 25, 46, 67]
moveCount=39,compareCount=30

4.字符串比较

字符串比较采用String.compareTo()方法.


  • 代码示例
public static void main(String[] args) {
        String a = "aaa";
        String b = "bbb";
        System.out.println(a.compareTo(b));
        System.out.println(a.compareTo(a));
        System.out.println(b.compareTo(a));
    }

输出:

-1
0
1