[算法] 排序

2019-01-15  本文已影响0人  舒也ella
void insertSort(vector<uint>& A) {
    for (int j = 1; j < A.size(); j++) {
        uint x = A[j];
        int i = j - 1;
        while (i >= 0 && A[i] > x) {
            A[i+1] = A[i];
            i--;
        }
        A[i+1] = x;
    }
}
void shellSort(vector<uint>& A) {
    int n = (int)A.size();
    for (int gap = n/2; gap > 0; gap /= 2)
    {
        for (int j = gap; j < n; j++) {
            uint x = A[j];
            int i = j - gap;
            while (i >= 0 && A[i] > x) {
                A[i + gap] = A[i];
                  i -= gap;
            }
            A[i + gap] = x;
        }
    }

}
void merge(vector<uint>& A, int p, int q, int r) {
    vector<uint> L;
    L.reserve(q-p+1);
    vector<uint> R;
    R.reserve(r-q);
    for (int i = p; i <= q; i++) {
        L.push_back(A[i]);
    }
    for (int i = q+1; i <= r; i++) {
        R.push_back(A[i]);
    }
    int i = 0, j = 0, k = p;
    while (i < L.size() && j < R.size()) {
        if (L[i] <= R[j]) {
            A[k++] = L[i++];
        } else {
            A[k++] = R[j++];
        }
    }
    while (i < L.size()) {
        A[k++] = L[i++];
    }
    while (j < R.size()) {
        A[k++] = R[j++];
    }
}

void mergeSort(vector<uint>& A, int p, int r) {
    if (p < r) {
        int q = (p + r) / 2;
        mergeSort(A, p, q);
        mergeSort(A, q+1, r);
        merge(A, p, q, r);
    }
}
void countSort(vector<uint>& A, uint place) {
    int n = (int)A.size();
    vector<uint> output(n, 0);
    vector<uint> count(10, 0);
    for (int i = 0; i < n; i++) {
        count[(A[i] / place) % 10]++;
    }
    for (int i = 1; i < 10; i++) {
        count[i] += count[i-1];
    }
    for (int i = n-1; i >= 0; i--) {
        output[count[(A[i] / place) % 10] - 1] = A[i];
        count[(A[i] / place) % 10]--;
    }
    for (int i = 0; i < n; i++) {
        A[i] = output[i];
    }
}

稳定 O(n+k)

void radixSort(vector<uint>& A, uint max) {
    
    uint place = 1u;
    int d = 1;
    uint p = 10u;
    while (max >= p)
    {
        max /= 10u;
        ++d;
    }
    for (int i = 0; i < d; i++) {
        countSort(A, place);
        place *= 10;
    }
}
上一篇 下一篇

猜你喜欢

热点阅读