数据结构与算法总结(五)

116 阅读1分钟

快速排序

  • 给定一个数组arr,和一个整数num。请把小于等于num的数放在数组的左边,大于num的数放在数组的右边。要求额外空间复杂度O(1),时间复杂度O(N)
public static void partition1(int[] arrs, int num) {
        int small_index = 0;
        int bigger_index = arrs.length - 1;
        int index = 0;
        while (small_index < bigger_index) {
            int temp = arrs[index];
            if(temp<=num){
                arrs[index] = arrs[small_index];
                arrs[small_index] = temp;
                index++;
                small_index++;
            }else {
                arrs[index] = arrs[bigger_index];
                arrs[bigger_index] = temp;
                bigger_index--;
            }

        }

        System.out.println(Arrays.toString(arrs));
    }
  • 荷兰国旗问题
    • 给定一个数组arr,和一个整数num。请把小于num的数放在数组的左边,等于num的数放在中间,大于num的数放在数组的右边。要求额外空间复杂度O(1),时间复杂度O(N)
public static int[] netherlandsFlag(int[] arr, int L, int R) {
        if (L > R) {
            return new int[] { -1, -1 };
        }
        if (L == R) {
            return new int[] { L, R };
        }
        int less = L - 1;
        int more = R;
        int index = L;
        while (index < more) {
            if (arr[index] == arr[R]) {
                index++;
            } else if (arr[index] < arr[R]) {
                swap(arr, index++, ++less);
            } else {
                swap(arr, index, --more);
            }
        }
        swap(arr, more, R);
        return new int[] { less + 1, more };
    }
  • 随机快排
    • 思路:随机获取一个位置的数放在最右端,将整体数组进行荷兰国旗算法返回小于边界和大于边界,再分别对小于区域和大于区域进行排序。
public static void quickSort(int[] arr) {
        if (arr == null || arr.length < 2) {
            return;
        }
        process(arr, 0, arr.length - 1);
    }

    public static void process(int[] arr, int L, int R) {
        if (L >= R) {
            return;
        }
        swap(arr, L + (int) (Math.random() * (R - L + 1)), R);
        int[] equalArea = netherlandsFlag(arr, L, R);
        process(arr, L, equalArea[0] - 1);
        process(arr, equalArea[1] + 1, R);
    }

    public static void swap(int[] arr, int i, int j) {
        int tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }