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

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 ? " " : "\n");
    }
    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 ? " " : "\n");
    }
    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 ? " " : "\n");
    }
    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 ? " " : "\n");
    }
    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 ? " " : "\n");
        }
    }
    return 0;
}
View Code

 

posted @ 2018-11-29 20:00  丧心病狂工科女  阅读(229)  评论(0编辑  收藏  举报