算法--排序


*** 注:默认排序完成顺序为从小到大 ***

排序

常用函数

public class Example {
    public static boolean less(Comparable a, Comparable b) {  //a<b?
        return a.compareTo(b) < 0;
    }

    public static void exch(Comparable[] a, int i, int j) {   // exch=exchange
        Comparable t = a[i];
        a[i] = a[j];
        a[j] = t;
    }
}

选择排序

原理

有一个数组Array长度为N,从Array[0]-Array[N]中选出最小的和Array[0]交换,然后从Array[1]-Array[N]中选出最小的和Array[1]交换。

模拟

时间复杂度:

最优情况下即开始时顺序已排列好。
需要比较N+(N-1)+(N-2)+........+0;
交换0次
最坏情况下
需要比较N+(N-1)+(N-2)+........+0
交换N-1次

代码

public static void Selection_Sort(Comparable[] a) {
        int N = a.length;
        int min;
        for (int i = 0; i < N; i++) {
            min = i;
            for (int j = i + 1; j < N; j++)
                if (less(a[j], a[min]))
                    min = j;
            exch(a, i, min);
        }
    }

插入排序

时间复杂度:

最优情况下即开始时顺序已排列好。
需要
比较N-1次
交换0次
最坏情况下即开始时为从大到小排列
需要
比较1+2+3+4+......+N-1次
交换1+2+3+4+......+N-1次
例:
5 4 3 2 1   比较    交换
4 5          1       1

4 3 5
3 4 5        2       2

4 3 2 5
4 2 3 5
2 3 4 5      3       3
   。
   。
   。
   。

代码

public static void Insertion_Sort(Comparable[] a) {
        int N = a.length;
        for (int i = 1; i < N; i++)
            for (int j = i; j > 0 && less(a[j], a[j - 1]); j--)
                exch(a, j, j - 1);
    }

希尔排序

原理

代码

public static void Shell_Sort(Comparable[] a) {
        int N = a.length;
        int h = 1;
        while (h < N / 3) h = h * 3 + 1;
        while (h >= 1) {
            for (int i = h; i < N; i++)
                for (int j = i; j >= h && less(a[j], a[j - h]); j -= h)
                    exch(a, j, j - h);
            h = h / 3;
        }
    }
原文地址:https://www.cnblogs.com/INnoVationv2/p/8486503.html