数据结构与算法之排序

176 阅读2分钟

各种排序算法时间复杂度和空间复杂度

快速排序

思想
放码过来
public class QuickSort {

    private static int Partition(int[] arr, int start, int end) {
        //arr[start]为挖的第一个坑
        int key = arr[start];
        while (start < end) {
            while (arr[end] >= key && end > start)
                end--;
            arr[start] = arr[end];
            while (arr[start] <= key && end > start)
                start++;
            arr[end] = arr[start];
        }
        arr[start] = key;
        return start;
    }

    public static void sort(int[] arr, int start, int end) {
        if (start < end) {
            int index = Partition(arr, start, end);
            sort(arr, start, index - 1);
            sort(arr, index + 1, end);
        }
    }
}

归并排序

排序思想

归并排序(MERGE-SORT) 是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。

分而治之

放码过来
public class MergeSort {
    public static void sort(int[] array,int low,int high) {
        if ((high-low) == 0||((high-low) == 1)) {
            return;
        }
        int mid = (low + high) / 2;
        if (low < high) {
            // 左边
            sort(array, low, mid);
            // 右边
            sort(array, mid + 1, high);
            // 左右归并
            mergeSort(array, low, mid, high);
        }
    }

    private static void mergeSort(int[] array, int low, int mid, int high) {
        int[] temp = new int[high - low + 1];
        int i = low;
        int j = mid + 1;
        int k = 0;
        //把数据移动到temp数据之中
        while (i <= mid && j <= high) {
            if (array[i] < array[j]) {
                temp[k++] = array[i++];
            } else {
                temp[k++] = array[j++];
            }
        }
        while (i <= mid) {
            temp[k++] = array[i++];
        }
        while (j <= high) {
            temp[k++] = array[j++];
        }
        //copy
        for (k = 0; k < temp.length; k++) {
            array[low + k] = temp[k];
        }
    }
}

选择排序

排序思想

选择排序(Selection sort) 是一种简单直观的排序算法。 它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。 以此类推,直到全部待排序的数据元素的个数为零。 选择排序是不稳定的排序方法。

放码过来
public class SelectSort {
    public static int[] sort(int[] array) {
        if (array.length == 0)
            return array;
        for (int i = 0; i < array.length; i++) {
            int minIndex = i;
            for (int j = i + 1; j < array.length; j++) {
                if(array[j]<array[minIndex]){
                    minIndex = j;
                }
            }
            //swap 下表 i 和 min
            int tmp = array[i];
            array[i] = array[minIndex];
            array[minIndex] = tmp;
        }
        return array;
    }
}

参考文章