题解 | #排序# C++ 解法,快排,归并,堆排

排序

http://www.nowcoder.com/practice/2baf799ea0594abd974d37139de27896

题解 | #排序#
C++ 解法,快排,归并,堆排

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 将给定数组排序
     * @param arr int整型vector 待排序的数组
     * @return int整型vector
     */
    // 快排
    void quick_sort(vector<int> &arr, int l, int r) {
        if (l >= r) return ;
        int x = l, y = r, z = arr[(l + r) >> 1];
        do {
            while (arr[x] < z) ++x;
            while (arr[y] > z) --y;
            if (x <= y) {
                swap(arr[x], arr[y]);
                ++x, --y;
            }
        } while (x <= y);
        quick_sort(arr, l, y);
        quick_sort(arr, x, r);
        return ;
    }
    // 归并
    void merge_sort(vector<int> &arr, int l, int r, vector<int> &tmp) {
        if (l >= r) return ;
        int mid = ((long long)l + r) >> 1;
        merge_sort(arr, l, mid, tmp);
        merge_sort(arr, mid + 1, r, tmp);
        int i = l, j = mid + 1;
        for (int k = l; k <= r; ++k) {
            tmp[k] = arr[k];
        }
        for (int k = l; k <= r; ++k) {
            if (i == mid + 1) {
                arr[k] = tmp[j++];
            } else if (j == r + 1 || tmp[i] <= tmp[j]) {
                arr[k] = tmp[i++];
            } else {
                arr[k] = tmp[j++];
            }
        }
        return ;
    }
    // 堆排
    void heapify(vector<int> &arr, int n, int i) {
        int l = 2 * i + 1;
        int r = 2 * i + 2;
        int max = i;
        if (l < n && arr[l] > arr[max]) {
            max = l;
        }
        if (r < n && arr[r] > arr[max]) {
            max = r;
        }
        if (max != i) {
            swap(arr[max], arr[i]);
            heapify(arr, n, max);
        }
        return ;
    }
    void build_heap(vector<int> &arr, int n) {
        int last_node_ind = n - 1;
        int parent = (last_node_ind - 1) >> 1;
        for (int i = parent; i >= 0; --i) {
            heapify(arr, n, i);
        }
        return ;
    }
    void heap_sort(vector<int> &arr, int n) {
        build_heap(arr, n);
        for (int i = n - 1; i >= 0; --i) {
            swap(arr[i], arr[0]);
            heapify(arr, i, 0);
        }
        return ;
    }
    vector<int> MySort(vector<int>& arr) {
        // quick_sort(arr, 0, arr.size() - 1);
        /* vector<int> tmp(arr.size());
        merge_sort(arr, 0, arr.size() - 1, tmp); */
        heap_sort(arr, arr.size());
        return arr;
    }
};
全部评论

相关推荐

7 1 评论
分享
牛客网
牛客企业服务