数据结构中十种经典排序方法汇总(C++)

十种排序写在一个文件里了

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<vector>
#include<unordered_map>
using namespace std;
class quick {
public:
    int partition(vector<int>& num, int left, int right) {
        int pivot = num[left];
        int l = left + 1, r = right;
        while (l <= r) {
            if (num[l] > pivot&&num[r] < pivot) {
                swap(num[l++], num[r--]);
            }
            if (num[l] <= pivot) {
                l++;
            }
            if (num[r] >= pivot) {
                r--;
            }
        }
        swap(num[left], num[r]);
        return r;
    }
    void helper(vector<int>& num, int left, int right) {
        if (left >= right) {
            return;
        }
        int pos = partition(num, left, right);
        helper(num, 0, pos - 1);
        helper(num, pos + 1, right);
    }
};
class heap {
public:
    void adjustHeap(vector<int>& num, int idx, int end) {
        int flag = idx;
        int left = 2 * idx + 1;
        int right = 2 * idx + 2;
        if (left < end&&num[left] > num[flag]) {
            flag = left;
        }
        if (right < end&&num[right] > num[flag]) {
            flag = right;
        }
        if (flag != idx) {
            swap(num[flag], num[idx]);
            adjustHeap(num, flag, end);
        }
    }
    void build_min_heap(vector<int>& num) {
        int heap_size = num.size();
        for (int i = heap_size / 2 - 1; i >= 0; i--) {
            adjustHeap(num, i, heap_size);
        }
    }
};
class shell {
public:
    void shellInsert(vector<int>& num, int d) {
        for (int i = 0; i < d; i++) {
            for (int j = i + d; j < num.size(); j += d) {
                int tmp = num[j];
                int k = j - d;
                while (k >= 0 && num[k] > num[j]) {
                    num[k + d] = num[k];
                    k -= d;
                }
                num[k + d] = tmp;
            }
        }
    }
};
class mergeN {
public:
    void merge(vector<int>& num, int left, int mid, int right) {
        vector<int> tmp;
        int i = left, j = mid + 1;
        while (i <= mid && j <= right) {
            if (num[i] <= num[j]) {
                tmp.push_back(num[i++]);
            }
            else {
                tmp.push_back(num[j++]);
            }
        }
        while (i <= mid) {
            tmp.push_back(num[i++]);
        }
        while (j <= right) {
            tmp.push_back(num[j++]);
        }
        for (int i = 0; i < tmp.size(); i++) {
            num[left + i] = tmp[i];
        }
    }
    void msort(vector<int>& num, int left, int right) {
        if (left < right) {
            int mid = (left + right) / 2;
            msort(num, left, mid);
            msort(num, mid + 1, right);
            merge(num, left, mid, right);
        }
    }
};
class radix {
public:
    void radixHelp(vector<int>& num, int exp) {
        vector<int> range(10, 0);
        //用push_back这些对vector进行操作的时候可以不初始化大小,但是用数组方式(下标插入)进行赋值需要进行初始化
        vector<int> tmp(num.size(), 0);
        for (int i = 0; i < num.size(); i++) {
            range[(num[i] / exp) % 10]++;
        }
        for (int i = 1; i < range.size(); i++) {
            range[i] += range[i - 1];
        }
        for (int i = num.size() - 1; i >= 0; i--) {
            tmp[range[(num[i] / exp) % 10] - 1] = num[i];
            range[(num[i] / exp) % 10]--;
        }
        num = tmp;
    }
};
class solution {
public:
    void printOut(const vector<int>& num) {
        for (int i = 0; i < num.size(); i++) {
            cout << num[i] << " ";
        }
        cout << endl;
    }
    void bubbleSort(vector<int>& num) {
        cout << "冒泡排序时间复杂度O(N2),空间复杂度O(1)" << endl;
        int len = num.size();
        if (len == 0) {
            return;
        }
        for (int i = 0; i < len - 1; i++) {
            for (int j = len - 1; j > i; j--) {
                if (num[j] < num[j - 1]) {
                    swap(num[j], num[j - 1]);
                }
            }
        }
    }
    void selectSort(vector<int>& num) {
        cout << "选择排序时间复杂度O(N2),空间度咋读O(1)" << endl;
        int len = num.size();
        if (len == 0) {
            return;
        }
        for (int i = 0; i < len-1; i++) {
            int flag = i;
            for (int j = i + 1; j < len; j++) {
                if (num[flag] > num[j]) {
                    flag = j;
                }
            }
            if (flag != i)
                swap(num[i], num[flag]);
        }
    }
    void insertSort(vector<int>& num) {
        cout << "插入排序时间复杂度O(N2),空间复杂度O(1)" << endl;
        int len = num.size();
        if (len == 0) {
            return;
        }
        for (int i = 1; i < len; i++) {
            int j = i;
            int target = num[i];
            while (j > 0 && target < num[j - 1]) {
                num[j] = num[j - 1];
                j--;
            }
            num[j] = target;
        }
    }
    void quickSort(vector<int>& num) {
        quick q;
        cout << "快排时间复杂度O(NlogN),最坏要O(N2)。空间复杂度O(logN)-O(N)" << endl;
        int len = num.size();
        if (len == 0) {
            return;
        }       
        q.helper(num, 0, num.size()-1);
    }
    void heapSort(vector<int>& num) {
        heap h;
        cout << "堆排序时间复杂度O(NlogN),空间复杂度O(1)" << endl;
        int len = num.size();
        if (len == 0) {
            return;
        }
        int heap_size = num.size();
        h.build_min_heap(num);
        for (int i = heap_size - 1; i >= 0; i--) {
            swap(num[0], num[i]);
            h.adjustHeap(num, 0, i);
        }
    }
    void shellSort(vector<int>& num) {
        shell sh;
        cout << "希尔排序时间复杂度O(1.3N),空间复杂度O(1)" << endl;
        int len = num.size();
        if (len == 0) {
            return;
        }
        int d = num.size() / 2;
        while (d >= 1) {
            sh.shellInsert(num, d);
            d /= 2;
        }
    }   
    void mergeSort(vector<int>& num) {
        mergeN mg;
        cout << "归并排序时间复杂度O(NlogN),空间复杂度O(N)" << endl;
        int len = num.size();
        if (len == 0) {
            return;
        }
        mg.msort(num, 0, num.size() - 1);
    }
    void countSort(vector<int>& num) {
        cout << "计数排序时间复杂度O(N),空间复杂度看情况" << endl;
        //计数排序是特殊的桶排序,把键值当做桶的下标
        int len = num.size();
        if (len == 0) {
            return;
        }
        unordered_map<int, int> count;
        for (auto n : num) {
            count[n]++;
        }
        int pos = 0;
        int max = *max_element(num.begin(), num.end());
        for (int i = 0; i <= max; i++) {
            for (int j = 0; j < count[i]; j++) {
                num[pos++] = i;
            }
        }
    }
    void radixSort(vector<int>& num) {
        radix r;
        cout << "基数排序,时间复杂度O(d(N+rd)),空间复杂度O(rd),其中r为基数,即radix的取值范围,十进制就是10,d为位数." << endl;
        int len = num.size();
        if (len == 0) {
            return;
        }
        int max = *max_element(num.begin(), num.end());
        for (int exp = 1; max / exp > 0; exp *= 10) {
            r.radixHelp(num,exp);
        }

    }
};
int main() {
    solution s;
    vector<int> num;
    cout << "原数组是:5,3,8,6,4" << endl;
    num = { 5,3,8,6,4 };
    s.bubbleSort(num);
    s.printOut(num);
    num = { 5,3,8,6,4 };
    s.selectSort(num);
    s.printOut(num);
    num = { 5,3,8,6,4 };
    s.insertSort(num);
    s.printOut(num);
    num = { 5,3,8,6,4 };
    s.quickSort(num);
    s.printOut(num);
    num = { 5,3,8,6,4 };
    s.heapSort(num);
    s.printOut(num);
    num = { 5,3,8,6,4 };
    s.shellSort(num);
    s.printOut(num);
    num = { 5,3,8,6,4 };
    s.mergeSort(num);
    s.printOut(num);
    num = { 5,3,8,6,4 };
    s.countSort(num);
    s.printOut(num);
    num = { 51,33,82,64,45 };
    s.radixSort(num);
    s.printOut(num);
    return 0;
}

参考链接:http://www.codeceo.com/10-sort-algorithm-interview.html#0-tsina-1-10490-397232819ff9a47a7b7e80a40613cfe1

猜你喜欢

转载自blog.csdn.net/potatostyles/article/details/79514063