一个蒟蒻写的有关排序的博客

#include<bits/stdc++.h>
using namespace std;
int t[40000000];
int main(){
    int n, m;
    scanf("%d %d", &n, &m);
    int a[n];
    for(int i=0;i<n;++i){
        scanf("%d", &a[i]);
        t[a[i]]++;
    }
    for(int i=1;i<=m;++i){
        if(t[i] == 0){
            continue;
        }else{
            for(int j=0;j<t[i];++j){
                printf("%d ", i);
            }
        }
    }
    return 0;
}
//以上为桶排序,n为有几个数进行排序,m为下面数的范围
#include<bits/stdc++.h>
using namespace std;
int main(){
    int n, t;
    scanf("%d", &n);
    int a[n];
    for(int i=0;i<n;++i){
        scanf("%d", &a[i]);
    }
    for(int i=0;i<n;++i){
        for(int j=i+1;j<n;++j){
            if(a[i] > a[j]){
                t = a[i];
                a[i] = a[j];
                a[j] = t;
            }
        }
    }
    for(int i=0;i<n;++i){
        printf("%d ", a[i]);
    }
    return 0;
}
//以上为选择排序,选择排序可类比似打擂台,用第i个数去和他之后的数一一比较,若第j个数比第i个小,则进行交换
#include<bits/stdc++.h>
using namespace std;
int main() {
    int n, t;
    scanf("%d", &n);
    int a[n];
    for(int i=0; i<n; ++i) {
        scanf("%d", &a[i]);
    }
    for(int i=1; i<n; ++i) {
        for(int j=0; j<n-i; ++j) {
            if(a[j] > a[j+1]) {
                t = a[j];
                a[j] = a[j+1];
                a[j+1] = t;
            }
        }
    }
    for(int i=0; i<n; ++i) {
        printf("%d ", a[i]);
    }
    return 0;
}
//以上为冒泡排序,将第j个数与第j往上个数相比较,最后的那个最值可以不参与第二次的比较
//因为它是一个一个比上去的所以可以不参与比较(就算比了也撼动不了)
//注意外层的i表示的是循环次数,n个数字,两两相比,应该比较n-1次

#include<bits/stdc++.h>
using namespace std;
int n;
int a[10086];
void Sort(int n, int a[]) {
    if(n == 1) {
        return;
    }//仅有一个数字的话直接跳出函数即可,因为没什么好排的 
    Sort(n-1, a);//调用 
    int tmp=a[n];//将最后一个数字给往前面的数字中插入 
    int i;//一个指针 
    for(i=n-1; i>=1; i--) {//从后往前遍历,找寻大于它的数然后赋值 
        if(a[i] > tmp) {
            a[i+1] = a[i];//赋值 
        } else {
            break;//如果遇到小于的则说明他这个数到这了,该插入了 
        }
    }
    a[i+1] = tmp;//插入 
}
int main() {
    scanf("%d", &n);
    for(int i=1; i<=n; ++i) {
        scanf("%d", &a[i]);
    }//输入 
    Sort(n, a);//调用 
    for(int i=1; i<=n; ++i) {
        printf("%d ", a[i]);
    }//输出 
    return 0;
}
//插入排序
//在实现的过程中大概如此
/*假定输入3 4 1进行排序
先递归直至3这个数
此时再往回走
n=2。 3 4进行操作
tmp = 4
a[n-1]即a[1] == 3
3 < 4
break;
此时i == n-1 == 1;
a[i+1] == a[n] == a[2] == tmp;
再回
n == 3
tmp = 1;
tmp < a[i](a[n-1])
a[i+1] = a[i];
此时的数组中为3 4 4
重复上述操作
得到3 3 4
i--后得到0
i+1 == 1
a[i+1] = tmp;
找到位置插入
*/ 

#include<bits/stdc++.h>
using namespace std;
int a[10086], b[10086], n;//全局变量 
void merge(int a[], int l, int mid, int r, int t[]){//用来实现两个有序数列的合并 
    int i=l, j=mid+1, k=l;//定义指针i, j, k 
    while(i <= mid && j <= r) //让两个指针分别从各自的头开始,遍历比较每一组数 
    if(a[i] <= a[j]) t[k++] = a[i++];//如果i, j相比,a[i]小于a[j]则将a[i]存入至临时数组t[k]中实现后i, k后移 
    else t[k++] = a[j++];//如果a[j]小于a[i]则将a[j]存入至临时数组t[k]中,并将指针后移 
    while(i <= mid) t[k++] = a[i++];
    while(j <= r) t[k++] = a[j++];
//上面这两行是在判断哪个里面的数组不为空(因为两相比较下来定有一个多余)
//继续实现赋值与指针后移 
    for(i=l;i<=r;i++) a[i] = t[i];//将原来临时数组中的数据存回去 
}
void merge_sort(int a[], int l, int r, int t[]){
    if(r == l){
        return;
    }//判断基础情况,如果一边里面只有一个数,那定是排好序的 
    int mid = l + (r - l)/2;//定义中间 
    merge_sort(a, l, mid, t);//从1至mid的一个数组 
    merge_sort(a, mid+1, r, t);//从mid+1至r(即n)的一个数组 
    merge(a, l, mid, r, t);//最后合并实现 
}
int main(){
    scanf("%d", &n);
    for(int i=1;i<=n;i++){
        scanf("%d", &a[i]);
    }//输入 
    merge_sort(a, 1, n, b);//调用 
    for(int i=1;i<=n;i++){
        printf("%d ", a[i]);
    }//输出 
    return 0;
}
//归并思维排序
#include<bits/stdc++.h>
using namespace std;
int n, a[10086];
void quick_sort(int a[], int l, int r){
    if(l == r) return ;// 
    int i=l;//一个指针从头开始 
    int j=r;//一个指针从尾开始 
    int mid=a[l+rand()%(r-l+1)];//随机定义一个mid数值,然后进行分两类 
    while(i<=j){//i还小于或等于j即i、j尚未相遇 
        while(a[i] < mid) i++;//如果符合判定则将i指针直接后移一位,使得那个数字包含于那个数组 
        while(a[j] > mid) j--;//如果符合判定则将j指针直接前移一位,使得那个数字包含于那个数组 
        if(i <= j){
            swap(a[i], a[j]);
            i++;
            j--;
        }//如果前两项均不符合,即有大于mid的存在在i这边,有小于mid的存在在j这边,则将它俩交换并指针移动 
    }
    if(l < j) quick_sort(a, l, j);//对mid左边的进行排序 
    if(i < r) quick_sort(a, i, r);//对mid右边的进行排序
//    因为在分两类的时候左边的都是小于mid,右边的都是大于mid的所以在分别将两边排好序后,直接合并即可得到最后结果 
}
int main(){
    scanf("%d", &n);
    for(int i=1;i<=n;++i){
        scanf("%d", &a[i]);
    }//输入 
    quick_sort(a, 1, n);//调用 
    for(int i=1;i<=n;++i){
        printf("%d ", a[i]);
    }//输出 
    return 0;

//快速排序 

//第一次写,应该也不是很全(其实sort直接快排就行)

//以后学了别的会补全,也希望各位大佬指出需要改进的地方

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值