冒泡、选择、插入排序及其应用场景

1.冒泡排序

冒泡排序是最简单的排序方法,分为内外两层for循环。外层循序代表的是总共要跑的趟数,2个数据比较一趟。3个数据比较两趟,以此类推,n个数据就跑n-1趟。内层循环是真正比价数据大小的。每次比较都会讲大的数据放到后面。代码如下:

    private static void bubbleSort(int datas[]) {
        int temp;
        for (int i = 0; i < datas.length - 1; i++) {
            for (int j = i + 1; j < datas.length; j++) {
                if (datas[j] < datas[i]) {//交换数据
                    temp = datas[j];
                    datas[j] = datas[i];
                    datas[i] = temp;
                }

            }
        }
    }

2.选择排序

选择排序原理是先将数组中最小的元素找到并且标记,即记录最小数据的下标,将找到的最小元素移动到最左侧,也就是目前的下标最小的位置,下次比较就除去上次找到并且移动的最小值,对剩下数据继续重复上述操作,直到排序结束。选择排序其实可以算是对冒泡排序的一个优化,区别就是冒泡排序每次比较完将大小不对数据进行交换,选择排序跟冒泡的对比时间复杂度是一样的,只是每次内循环都将数据最小的角标标记,然后再交换数据,所以选择排序的数据交换时间复杂度是低于冒泡排序的,代码如下:

    private static void chooseSort(int[] datas) {
        int minIndex;
        int temp;
        for (int i = 0; i < datas.length - 1; i++) {
            minIndex = i;
            for (int j = i + 1; j < datas.length; j++) {
                if (datas[j] < datas[minIndex]) {
                    minIndex = j;
                }
            }

            if (minIndex != i) {
                temp = datas[minIndex];
                datas[minIndex] = datas[i];
                datas[i] = temp;
            }
        }
    }

3.插入排序

原理:插入排序会将目前基本有序的一部分数组提取出来,然后将这部分数组的最右侧的一个元素的右侧元素做标记,将这个元素与前面基本有序的数组进行比较,找到比他稍大的元素,并且移动到比他稍大的元素前面,剩余的未排序元素重复执行上述操作,知道排序结束。所以插入排序的时间复杂度与他的基本有序部分的大小有关,如果数组是正好逆序的,他的时间复杂度甚至不会比,冒泡排序高。

    private static void insertSort(int[] datas) {
        int temp;
        for (int i = 1; i < datas.length; i++) {
            temp = datas[i];
            int j = i;
            for (; j > 0 && temp < datas[j - 1]; j--) {
                datas[j] = datas[j - 1];
            }
            datas[j] = temp;
        }
    }

4.应用场景

冒泡排序:使用最简单,适用于数据量很小的排序场景。

选择排序:适用于大多数排序场景,虽然他的对比次数较多,但是数据量大的时候,他的效率明显优于冒泡,而且数据移动是非常耗时的,选择排序移动次数少。

插入排序:插入排序适用于已有部分数据有序的情况,有序部分越大越好。

 

你可能感兴趣的:(#,数据结构)