• 很多很多排序(未完待更 每天佛系更新)


    1.冒泡排序

    这个写法是先把小的数字排出来然后再排出来大的数字

    代码:

    #include <bits/stdc++.h>
    using namespace std;
    
    const int maxn = 1e5 + 10;
    int n;
    int num[maxn];
    
    void BubbleSort(int L, int R) {
        for(int i = L; i <= R; i ++) {
            int flag = 0;
            for(int j = R; j > i; j --) {
                if(num[j] < num[j - 1]) {
                    swap(num[j], num[j - 1]);
                    flag = 1;
                }
            }
            if(!flag) break;
        }
    }
    
    int main() {
        scanf("%d", &n);
        for(int i = 0; i < n; i ++)
            scanf("%d", &num[i]);
    
        BubbleSort(0, n - 1);
        for(int i = 0; i < n; i ++) {
            printf("%d", num[i]);
            printf("%s", i != n - 1 ? " " : "
    ");
        }
        return 0;
    }
    View Code

    2.插入排序

    从前向后依次把每一个 $num[i]$ 插入到正确的位置

     代码:

    #include <bits/stdc++.h>
    using namespace std;
    
    const int maxn = 1e5 + 10;
    int n;
    int num[maxn];
    
    void InsertSort(int L, int R) {
        for(int i = L; i <= R; i ++) {
            for(int j = i; j > L; j --) {
                if(num[j] < num[j - 1])
                    swap(num[j], num[j - 1]);
                else break;
            }
        }
    }
    
    int main() {
        scanf("%d", &n);
        for(int i = 0; i < n; i ++)
            scanf("%d", &num[i]);
    
        InsertSort(0, n - 1);
        for(int i = 0; i < n; i ++) {
            printf("%d", num[i]);
            printf("%s", i != n - 1 ? " " : "
    ");
        }
        return 0;
    }
    View Code

    3.选择排序

    每次在上一次排好剩下的元素李选最小的排出来

    代码:

    #include <bits/stdc++.h>
    using namespace std;
    
    const int maxn = 1e5 + 10;
    int n;
    int num[maxn];
    
    void SelectSort(int L, int R) {
        for(int i = L; i < R; i ++) {
            int minn = num[i];
            int temp = i;
            for(int j = i + 1; j <= R; j ++) {
                if(num[j] < minn) {
                    minn = num[j];
                    temp = j;
                }
            }
            swap(num[i], num[temp]);
        }
    }
    
    int main() {
        scanf("%d", &n);
        for(int i = 0; i < n; i ++)
            scanf("%d", &num[i]);
    
        SelectSort(0, n - 1);
        for(int i = 0; i < n; i ++) {
            printf("%d", num[i]);
            printf("%s", i != n - 1 ? " " : "
    ");
        }
        return 0;
    }
    View Code

     4.归并排序

    中间分两段 两端分别拍好之后再合并

    代码:

    #include <bits/stdc++.h>
    using namespace std;
    
    const int maxn = 1e5 + 10;
    int N;
    int a[maxn], b[maxn];
    
    void MergeSort(int L, int R) {
        if(L == R) return ;
    
        int mid = (R - L) / 2 + L;
        MergeSort(L, mid);
        MergeSort(mid + 1, R);
        int p1 = L, p2 = mid + 1, k = 0;
        while(p1 <= mid || p2 <= R) {
            if(p1 <= mid && p2 > R)
                b[k ++] = a[p1 ++];
            else if(p1 > mid && p2 <= R)
                b[k ++] = a[p2 ++];
            else {
                if(a[p1] < a[p2])
                    b[k ++] = a[p1 ++];
                else
                    b[k ++] = a[p2 ++];
            }
        }
    
        for(int i = L; i <= R; i ++)
            a[i] = b[i - L];
    }
    
    int main() {
        scanf("%d", &N);
        for(int i = 0; i < N; i ++)
            scanf("%d", &a[i]);
        MergeSort(0, N - 1);
        for(int i = 0; i < N; i ++) {
            printf("%d", a[i]);
            printf("%s", i != N - 1 ? " " : "
    ");
        }
        return 0;
    }
    View Code

    5.堆排序

    用 Insert 函数把数组放到一个最小堆里面 然后用 Get 函数不断得到最小值

    #include <bits/stdc++.h>
    using namespace std;
    
    const int maxn = 1e5 + 10;
    int T, N;
    int a[maxn];
    
    class Heap{
    private:
        int heap_[maxn];
        int sz_;
    public:
        Heap() {
            sz_ = 0;
        }
    
        void Insert(int x) {
            sz_ ++;
            heap_[sz_] = x;
            int id = sz_;
            while(id > 1) {
               if(heap_[id] < heap_[id / 2]) {
                    swap(heap_[id], heap_[id / 2]);
                    id /= 2;
               } else break;
            }
        }
    
        int Get() {
            int res = heap_[1];
            heap_[1] = heap_[sz_];
            sz_ --;
            int id = 1;
            while(id <= sz_) {
                if(id * 2 > sz_)
                    break;
    
                int minn = heap_[id * 2];
                if(id * 2 + 1 <= sz_ && heap_[id * 2 + 1] < heap_[id * 2])
                    minn = heap_[id * 2 + 1];
                if(heap_[id] < minn)
                    break;
    
                int to;
                if(minn == heap_[id * 2])
                    to = id * 2;
                else to = id * 2 + 1;
    
                swap(heap_[id], heap_[to]);
                id = to;
            }
            return res;
        }
    };
    
    void HeapSort(int L, int R) {
        Heap heap;
        for(int i = L; i <= R; i ++)
            heap.Insert(a[i]);
        for(int i = L; i <= R; i ++)
            a[i] = heap.Get();
    }
    
    int main() {
        scanf("%d", &T);
        while(T --) {
            scanf("%d", &N);
            for(int i = 1; i <= N; i ++)
                scanf("%d", &a[i]);
    
            HeapSort(1, N);
            for(int i = 1; i <= N; i ++) {
                printf("%d", a[i]);
                printf("%s", i != N ? " " : "
    ");
            }
        }
        return 0;
    }
    View Code
  • 相关阅读:
    C++基础学习6:内联函数
    lvm
    yum源
    mysql性能优化
    PXE
    dns配置
    进程命令
    ssh免密登陆和加密解密
    RAID阵列
    快速部署postfix邮件服务器
  • 原文地址:https://www.cnblogs.com/zlrrrr/p/10040496.html
Copyright © 2020-2023  润新知