常见排序算法整理

一 排序算法

1.1 冒泡排序

public void maoPaoSort(int[] arr) {
        if (arr.length < 2) {
            return;
        }
        for (int i = arr.length; i > 0; i--) {
            for (int j = 0; j < i - 1; j++) {
                if (arr[j] > arr[j + 1]) {
                    swap(arr, j, j + 1);
                }
            }
        }
    }

1.2 选择排序

public void selectSort(int[] arr) {
        if (arr.length < 2) {
            return;
        }
        for (int i = 0; i < arr.length - 1; i++) {
            int index = i;
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[index] > arr[j]) {
                    index = j;
                }
            }
            swap(arr, i, index);
        }
    }

1.3 插入排序

public void selectSort(int[] arr) {
        if (arr.length < 2) {
            return;
        }
        for (int i = 0; i < arr.length - 1; i++) {
            int index = i;
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[index] > arr[j]) {
                    index = j;
                }
            }
            swap(arr, i, index);
        }
    }

1.4 归并排序

public void guiBingSort(int[] arr, int left, int right) {
        if (left == right) {
            return;
        }
        int mid = left + (right - left) >> 1;
        guiBingSort(arr, left, mid);
        guiBingSort(arr, mid + 1, right);
        merge(arr, left, mid, right);
    }

    private static void merge(int[] arr, int left, int mid, int right) {
        int[] temp = new int[right - left + 1];
        int i = left, j = mid + 1, index = 0;
        while (i <= mid && j <= right) {
            temp[index++] = arr[i] < arr[j] ? arr[i++] : arr[j++];
        }
        while (i <= mid) {
            temp[index++] = arr[i++];
        }
        while (j <= right) {
            temp[index++] = arr[j++];
        }
        for (i = 0; i < temp.length; i++) {
            arr[left++] = temp[i];
        }
    }

1.5 快速排序

public void quickSort(int[] arr, int left, int right) {
        if (left == right) {
            return;
        }
        int[] mid = partition(arr, left, right);
        quickSort(arr, left, mid[0]);
        quickSort(arr, mid[1], right);
    }

    private int[] partition(int[] arr, int left, int right) {
        int index = left, L = left - 1, R = right, num = arr[right - 1];
        while (index < R) {
            if (arr[index] < num) {
                swap(arr, index++, ++L);
            } else if (arr[index] > num) {
                swap(arr, index, --R);
            } else {
                index++;
            }
        }
        return new int[] { L + 1, R };
    }

1.6 堆排序

public void heapSort(int[] arr) {
        if (arr.length < 2) {
            return;
        }
        createHeap(arr, arr.length);
        for (int i = 0; i < arr.length - 1; i++) {
            swap(arr, 0, arr.length - 1 - i);
            heapify(arr, 0, arr.length - 1 - i);
        }
    }

    private static void heapify(int[] arr, int index, int heapSize) {

        if (index < heapSize && (2 * index + 1) < heapSize) {
            if (2 * index + 2 < heapSize) {
                if (arr[2 * index + 1] > arr[index] || arr[2 * index + 2] > arr[index]) {
                    int maxIndex = arr[2 * index + 1] > arr[2 * index + 2] ? 2 * index + 1 : 2 * index + 2;
                    swap(arr, index, maxIndex);
                }
            } else {
                if (arr[2 * index + 1] > arr[index]) {
                    swap(arr, index, 2 * index + 1);
                }
            }
        }
    }

    private static void createHeap(int[] arr, int heapSize) {
        for (int i = 1; i < heapSize; i++) {
            int j = i;
            while (j > 0) {
                if (arr[j] > arr[(j - 1) / 2]) {
                    swap(arr, j, (j - 1) / 2);
                    j = (j - 1) / 2;
                } else {
                    break;
                }
            }
        }
    }

二 排序算法耗时及时间复杂度、稳定性

image.png
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容