• 八大排序代码——总结


    稳定排序有:插入排序、冒泡排序、归并排序、基数排序
    (基冒插归)
    不稳定排序有:选择排序、快速排序、希尔排序、堆排序
    (快选希堆)

    默认从小到大排序

    插入排序 O(n^2) 稳定

    void insertSort(int a[], int n)
    {
        for(int i = 1; i < n; i ++){
            int tmp = a[i],j;
            for(j = i; j > 0 && tmp < a[j-1]; j--)
                a[j] = a[j-1];
            a[j] = tmp;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    冒泡排序 O(n^2) 稳定

    void bubbleSort(int a[], int n)
    {
        for(int i = n-1; i > 0; i --){
            for(int j = 0; j < i; j ++){
                if(a[j] > a[j+1]) swap(a[j],a[j+1]);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    冒泡排序优化版 O(n^2) 稳定

    void bubbleSort(int a[], int n)
    {
        for(int i = n-1; i > 0; i --){
            bool flag = true;
            for(int j = 0; j < i; j ++){
                if(a[j] > a[j+1]) swap(a[j],a[j+1]),flag = false;
            }
            if(flag) break;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    归并排序 O(nlogn) 稳定

    int n;
    int q[N],tmp[N];
    
    void merge_sort(int q[],int l,int r){
        if(l >= r) return ;
        int mid = (l+r)/2;
        merge_sort(q,l,mid);
        merge_sort(q,mid+1,r);
        int i = l,j = mid+1,k = 0;
        while(i <= mid && j <= r){
            if(q[i] < q[j]) tmp[k++] = q[i++];
            else tmp[k++] = q[j++];
        }
        while(i <= mid) tmp[k++] = q[i++];
        while(j <= r) tmp[k++] = q[j++];
        for(int i = l,j = 0; i <= r; i ++,j ++) q[i] = tmp[j];
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    选择排序 O(n^2)

    void selectSort(int a[], int n)
    {
        for(int i = 0; i < n - 1; i++)
        {
            for(int j = i + 1; j < n; j++)
            {
                if(a[i] > a[j]) swap(a[i], a[j]);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    快速排序 O(nlogn)

    //教科书版:取左边界为基值
    void quick_sort(int l,int r){
        if(l>= r) return ;
        int i = l, j = r,tmp = q[l];
        while(i < j){
            while(i < j && q[j] >= tmp) j--;
            if(i < j) q[i++] = q[j];
            while(i < j && q[i] <= tmp) i++;
            if(i < j) q[j--] = q[i];
        }
        q[i] = tmp;
        quick_sort(l,i-1);
        quick_sort(i+1,r);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    //y总写的快排
    void quick_sort(int l,int r){
        if(l >= r) return ;
        int x = q[l+r>>1];
        int i = l - 1,j = r + 1;
        while(i < j){
            do i ++; while(q[i] < x);
            do j --; while(q[j] > x);
            if(i < j) swap(q[i],q[j]);
        }
        quick_sort(l,j);
        quick_sort(j+1,r);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    堆排序 O(nlogn)

    int heap[N];
    
    void down(int u){
        int t = u;
        if(2*u <= n && heap[2*u] < heap[t]) t = 2*u;
        if(2*u + 1 <= n && heap[2*u+1] < heap[t]) t = 2*u+1;
        if(t != u){
            swap(heap[t],heap[u]);
            down(t);
        }
    }
    
    //输出最小的m个数
    int main(){
        cin >> n >> m;
        for(int i = 1; i <= n; i ++ ) cin >> heap[i];
        for(int i = n/2; i >= 1; i --) down(i);
        while(m --){
            cout<
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
  • 相关阅读:
    【MySQL】MySQL 官方安装包形式
    Semantic Kernel 入门系列:🍋Connector连接器
    docker安装RocketMQ
    【数据结构】线性表的应用:稀疏一元多项式运算器
    java语法复习:注解
    K8S 1.20 弃用 Docker 评估之 Docker CLI 的替代产品 nerdctl
    全网显示 IP 归属地,这背后的技术你知道吗?
    lwIP 操作系统模拟层
    el-table表格进行排序 & 清除排序和清除排序箭头的高亮图标
    CentOS如何使用Htop监控工具
  • 原文地址:https://blog.csdn.net/weixin_45821690/article/details/133930089