八大排序代码——总结

稳定排序有:插入排序、冒泡排序、归并排序、基数排序

(基冒插归)

不稳定排序有:选择排序、快速排序、希尔排序、堆排序

(快选希堆)

默认从小到大排序

插入排序 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;
    }
}

冒泡排序 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]);
        }
    }
}

冒泡排序优化版 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;
    }
}

归并排序 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];
}

选择排序 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]);
        }
    }
}

快速排序 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);
}

//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);
}

堆排序 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<<heap[1]<<' ';
        heap[1] = heap[n--];
        down(1);
    }
    return 0;
}
相关推荐
愿所愿皆可成12 分钟前
机器学习之聚类Kmeans算法
算法·机器学习·kmeans·聚类
幻奏岚音12 分钟前
统计学(第8版)——假设检验学习笔记(考试用)
笔记·学习·算法
红衣信22 分钟前
二分查找算法:原理、实现与应用
排序算法
hie9889431 分钟前
基于matlab策略迭代和值迭代法的动态规划
算法·动态规划
Coovally AI模型快速验证33 分钟前
SFTrack:面向警务无人机的自适应多目标跟踪算法——突破小尺度高速运动目标的追踪瓶颈
人工智能·神经网络·算法·yolo·计算机视觉·目标跟踪·无人机
Brduino脑机接口技术答疑34 分钟前
脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
人工智能·算法·脑机接口·新手入门
真的很上进1 小时前
2025最全TS手写题之partial/Omit/Pick/Exclude/Readonly/Required
java·前端·vue.js·python·算法·react·html5
linweidong1 小时前
GO 基础语法和数据类型面试题及参考答案(下)
算法·后端面试·泛型·go面试·go面经·go求职
圈圈编码1 小时前
LeetCode Hot100刷题——合并两个有序链表
java·数据结构·算法·leetcode·链表
老歌老听老掉牙2 小时前
旋量理论:刚体运动的几何描述与机器人应用
python·算法·机器学习·机器人·旋量