十大排序(知识篇)--纯手工代码

简介: 十大排序(知识篇)--纯手工代码
//
//冒泡排序
//
#include <bits/stdc++.h>
using namespace  std;
void bubbleSort(int arr[],int len){
   bool flag = false;
   for(int i=0;i<len-1;i++){
       flag = false;
       for(int j=0;j<len-i-1;j++){
           if(arr[j] > arr[j+1]){
               swap(arr[j],arr[j+1]);
               flag = true;
           }
       }
       if(!flag){
           break;
       }
   }
}
//
// 计数排序
//
#include <bits/stdc++.h>
using namespace std;
void countingSort(int arr[],int len){
    int maxn = 0;
    for(int i=0;i<len;i++){maxn = max(maxn,arr[i]);}
    int t = maxn;
    int *cen = new int[maxn+10];
    for(int i=0;i<=maxn;i++){cen[i] = 0;}
    for(int i=0;i<len;i++){cen[arr[i]]++;}
    for(int i=1;i<=maxn;i++){cen[i] += cen[i-1];}
    int *ans = new int[len];
    for(int i=0;i<len;i++){
        ans[cen[arr[i]]-1] = arr[i];
        cen[arr[i]]--;
    }
    for(int i=0;i<len;i++){
        arr[i] = ans[i];
    }
    delete []ans;
    delete []cen;
}
//堆排序
#include <bits/stdc++.h>
using namespace std;
int heapSize = 0;
int left(int x){
    if(2*x+1 >= heapSize) return -1;
    return 2*x+1;
}
int right(int x){
    if(2*x+2 >= heapSize) return -1;
    return 2*x+2;
}
void minHeapify(int arr[],int x){
    int L = left(x);
    int R = right(x);
    int mann = x;
    if(L != -1 && arr[L] > arr[mann]){mann = L;}
    if(R != -1 && arr[R] > arr[mann]){mann = R;}
    if(mann != x){
        swap(arr[x],arr[mann]);
        x = mann;
        minHeapify(arr,x);
    }
}
void Delete(int arr[]){
    swap(arr[heapSize-1],arr[0]);
    heapSize--;
    minHeapify(arr,0);
}
void heapSort(int arr[],int len){
    //建立大顶堆
    heapSize = len;
    for(int i=(len-1)/2;i>=0;i--){
        minHeapify(arr,i);
    }
    //从堆中取结点
    for(int i=0;i<len;i++){
        Delete(arr);
    }
}
//
// 直接插入排序
//
#include <bits/stdc++.h>
using namespace std;
void insertSort(int arr[],int len){
    for(int i=1;i<len-1;i++){
        int j   =  i-1;
        int key =  arr[i];
        while(j>=0 && arr[j] > key){
            arr[j+1] = arr[j];
            j--;
        }
        arr[j+1] = key;
    }
}
//
// 归并排序
//
#include <bits/stdc++.h>
using namespace std;
void merge(int arr[],int l,int r){
    int mid = (l+r)/2;
    int nL  =  mid-l+1;
    int nR  =  r-mid;
    //创建两个行的数组存放
    int *L = new int[nL];
    int *R = new int[nR];
    for(int i=0;i<nL;i++){L[i]=arr[l+i];}
    for(int i=0;i<nR;i++){R[i]=arr[i+mid+1];}
    int i=0,j=0;        //分别指向L和R
    for(int k=l;k<=r;k++){
        if(j>=nR || (i<nL && L[i]<=R[j])){
            arr[k] = L[i++];
        }else{
            arr[k] = R[j++];
        }
    }
}
void mergeSort(int arr[],int l,int r){
    if(l < r){
        int mid = (l+r)/2;
        mergeSort(arr,l,mid);
        mergeSort(arr,mid+1,r);
        merge(arr,l,r);
    }
}
//
// 鸽巢排序
//
#include <bits/stdc++.h>
using namespace std;
void pigeonSort(int arr[],int len){
    int k = 0;
    for(int i=0;i<len;i++){k = max(k,arr[i]);}
    int *cen = new int[k+10];
    for(int i=0;i<=k;i++){cen[i]=0;}
    for(int i=0;i<len;i++){cen[arr[i]]++;}
    int j=0;
    for(int i=0;i<=k;i++){
        while(cen[i]){
            arr[j++] = i;
            cen[i]--;
        }
    }
    delete []cen;
}
//
//两种随机快排
//
#include <bits/stdc++.h>
using namespace std;
int partition(int arr[],int l,int r){
    int rd = l+rand()%(r-l);
    swap(arr[l],arr[rd]);
    int key = arr[rd];
    int i=l;
    for(int j=l;j<r;j++){
        if(arr[j] < key){
            swap(arr[i],arr[j]);
            i++;
        }
    }
    swap(arr[i],arr[r]);
    return i;
}
int partition2(int arr[],int l, int r){
    int ld = l+rand()%(r-l);
    swap(arr[l],arr[ld]);
    int key = arr[l];
    while(l < r){
        while(l<r && arr[l] <= key){l++;}
        arr[r] = arr[l];
        while(l<r && arr[r] > key){r--;}
        arr[l] = arr[r];
    }
    arr[l] = key;
    return l;
}
void quicksort(int arr[],int l,int r){
    if(l < r){
        int mid = partition2(arr,l,r);
        quicksort(arr,l,mid-1);
        quicksort(arr,mid+1,r);
    }
}
//
// 基数排序
//
#include <bits/stdc++.h>
using namespace std;
void redixSort(int arr[],int len){
    int maxn = 0;
    for(int i=0;i<len;i++){maxn = max(arr[i],maxn);}
    int t = maxn;
    int d = 0;
    while(t){t/=10;d++;}
    int mod = 10;
    for(int k=0;k<d;k++){
        queue<int> Bucket[10];
        for(int i=0;i<len;i++){
            Bucket[(arr[i]%mod) / (mod/10)].push(arr[i]);
        }
        int j=0;
        for(int i=0;i<10;i++){
            while(!Bucket[i].empty()){
                arr[j++] = Bucket[i].front();
                Bucket[i].pop();
            }
        }
        mod *= 10;
    }
}
//
// 选择排序
//
#include <bits/stdc++.h>
using namespace  std;
void selectSort(int arr[],int len){
    for(int i=0;i<len-1;i++){
        int minx = i;
        for(int j=i+1;j<len;j++){
            if(arr[j] < arr[minx]){minx = j;}
        }
        swap(arr[i],arr[minx]);
    }
}
//
// 希尔排序
//
#include <bits/stdc++.h>
using namespace std;
void shellSort(int arr[],int len){
    int gap =  len/2;
    while(gap >= 1){
       //做一个直接插入
       for(int i=gap;i<len;i++){
            int j = i - gap;
            int key = arr[i];
            while(j>=0 && arr[j] > key){
                arr[j+gap] = arr[j];
                j=j-gap;
            }
            arr[j+gap] = key;
       }
       gap = gap/2;
    }
}

如果有看不懂的地方,欢迎私聊和留下评论。。。必定及时解释

相关文章
|
8月前
|
存储 分布式计算 运维
云栖实录|驰骋在数据洪流上:Flink+Hologres驱动零跑科技实时计算的应用与实践
零跑科技基于Flink构建一体化实时计算平台,应对智能网联汽车海量数据挑战。从车机信号实时分析到故障诊断,实现分钟级向秒级跃迁,提升性能3-5倍,降低存储成本。通过Flink+Hologres+MaxCompute技术栈,打造高效、稳定、可扩展的实时数仓,支撑100万台量产车背后的数据驱动决策,并迈向流批一体与AI融合的未来架构。
581 3
云栖实录|驰骋在数据洪流上:Flink+Hologres驱动零跑科技实时计算的应用与实践
|
SQL 分布式计算 Oracle
数据同步工具DataX的安装
数据同步工具DataX的安装
5576 0
|
SQL 存储 HIVE
鹰角基于 Flink + Paimon + Trino 构建湖仓一体化平台实践项目
本文整理自鹰角网络大数据开发工程师朱正军在Flink Forward Asia 2024上的分享,主要涵盖四个方面:鹰角数据平台架构、数据湖选型、湖仓一体建设及未来展望。文章详细介绍了鹰角如何构建基于Paimon的数据湖,解决了Hudi入湖的痛点,并通过Trino引擎和Ranger权限管理实现高效的数据查询与管控。此外,还探讨了湖仓一体平台的落地效果及未来技术发展方向,包括Trino与Paimon的集成增强、StarRocks的应用以及Paimon全面替换Hive的计划。
1929 1
鹰角基于 Flink + Paimon + Trino 构建湖仓一体化平台实践项目
|
监控 Shell Linux
Android调试终极指南:ADB安装+多设备连接+ANR日志抓取全流程解析,覆盖环境变量配置/多设备调试/ANR日志分析全流程,附Win/Mac/Linux三平台解决方案
ADB(Android Debug Bridge)是安卓开发中的重要工具,用于连接电脑与安卓设备,实现文件传输、应用管理、日志抓取等功能。本文介绍了 ADB 的基本概念、安装配置及常用命令。包括:1) 基本命令如 `adb version` 和 `adb devices`;2) 权限操作如 `adb root` 和 `adb shell`;3) APK 操作如安装、卸载应用;4) 文件传输如 `adb push` 和 `adb pull`;5) 日志记录如 `adb logcat`;6) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
10175 2
|
JSON 小程序 JavaScript
超详细微信小程序开发学习笔记,看完你也可以动手做微信小程序项目
这篇文章是一份全面的微信小程序开发学习笔记,涵盖了从小程序介绍、环境搭建、项目创建、开发者工具使用、文件结构、配置文件、模板语法、事件绑定、样式规范、组件使用、自定义组件开发到小程序生命周期管理等多个方面的详细教程和指南。
|
C++
Vscode 内存过高的解决办法
Vscode 内存过高的解决办法
3639 0
|
JSON 自然语言处理 数据安全/隐私保护
jmeter响应和json断言,json断言提取多个值
jmeter响应和json断言,json断言提取多个值
|
大数据 流计算
江铃汽车基于 Flink 构建数据集成平台的设计与实现
江铃汽车基于 Flink 构建数据集成平台的设计与实现
|
10天前
|
人工智能 自然语言处理 文字识别
阿里云百炼Qwen3.7-Max简介:能力、优势、支持订阅计划参考
Qwen3.7-Max是阿里云百炼面向智能体时代推出的新一代旗舰模型,对标GPT-5.5、Claude Opus 4.7等闭源旗舰。该模型支持百万级token上下文窗口,具备顶级推理能力、多模态搜索与视觉理解增强、流式输出低延迟响应等核心优势,覆盖编程、办公、长周期自主执行等复杂场景。同时支持OpenAI接口兼容,便于系统快速迁移。用户可通过Token Plan团队或节省计划等订阅方式灵活调用,适合企业级高要求场景使用。
4250 20
阿里云百炼Qwen3.7-Max简介:能力、优势、支持订阅计划参考