新手初入Java(六)数组的排序方式

对数组中的数据进行排序,主要有以下四种方法:

  • 冒泡排序
  • 直接插入排序
  • 选择排序
  • Shell排序

(一)冒泡排序法:

  • 时间复杂度:O(n^2)
  • 空间复杂度:O(1)
  • 稳定性:稳定
    冒泡排序法的核心思想是将大的数据看作大的气泡,小的数据看作小的气泡,大的气泡降下去,小的气泡升上来。如图:
    冒泡第一次排序

如图,对数组中元素进行第一次排序,使1浮上来,将8沉了下去。
代码示例:

    public static void main(String[] args) {
        int[] array={2,5,8,3,1,6,7,4,9};
        for (int i = 0; i <array.length-1 ; i++) {
            for (int j = 0; j <array.length-1-i ; j++) {
                if(array[j]>array[j+1]) {
                    int tmp = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = tmp;
                }
            }
        }
        System.out.println(Arrays.toString(array));
    }
}

(二)直接插入排序

  • 越有序越快
  • 时间复杂度:
    无序:o(n^2)
    有序:o(n)
  • 空间复杂度:o(1)
  • 稳定性:稳定 直接插入排序没有出现跳跃式的交换
    直接插入排序核心思想是将第i个数字上拿出来给tmp,将j(i-1)上的数字与tmp比较,满足(array[j]>tmp)时将array[j]上的数字赋给array[j+1] 然后j-1,再次判断(array[j]>tmp),如果满足,则将array[j]上的数字赋给array[j+1],否则将tmp的值赋给array[j+1] ,如此i++,判断所有数字;如图:
public static void insertSort(int[] array){
    int tmp;
    for (int i = 1; i <array.length ; i++) {
        tmp=array[i];
        int j=0;
        for ( j = i-1; j >=0 ; j--) {
            if(array[j]>tmp){
                array[j+1]=array[j];
            }else{
                break;
            }
        }
        array[j+1]=tmp;
    }
}

(三)选择排序

  • 时间复杂度:o(n^2)
  • 空间复杂度:o(1)
  • 稳定性:不稳定

选择排序与冒泡排序比较相似,所以在我们不熟悉冒泡排序的时候容易将冒泡排序写成选择排序,选择排序的基本思想如图:

选择排序

代码示例:

public static void selectSort(int[] array){
    int tmp=0;
    for (int i = 0; i <array.length ; i++) {
        for (int j = i+1; j <array.length ; j++) {
            if(array[i]>array[j]){
                tmp=array[j];
                array[j]=array[i];
                array[i]=tmp;
            }
        }
    }
    System.out.println(Arrays.toString(array));
}

(四)shell排序

  • 时间复杂度:O(n^1.3 – ^1.5)
  • 空间复杂度:O(1)
  • 稳定性:不稳定

特点:

  • 快速
  • 增量序列: 总为质数 即除了它本身和1没有其他因子
    shell排序的思想是先分组,进行组内插入排序。如图:
    shell排序

代码示例:

public class shellSort {
    public static void shell(int[] array, int gap) {
        int tmp = 0;
        for (int i = gap; i < array.length; i++) {
            tmp = array[i];
            int j = 0;
            for (j = i - gap; j >= 0; j -= gap) {
                if (array[j] > tmp) {
                    array[j + gap] = array[j];
                } else {
                    break;
                }
            }
            array[j + gap] = tmp;
        }
    }

    public static void shellSort(int[] array) {
        int drr[] = {5, 3, 1};  //增量序列
        for (int i = 0; i < drr.length; i++) {
            shell(array, drr[i]);
        }
    }

    public static void main(String[] args) {
        int[] array = {12, 7, 2, 8, 15, 67, 94, 34, 16, 13, 31, 27, 65, 82, 21};
        shellSort(array);
        System.out.println(Arrays.toString(array));
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章