6种排序算法

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

冒泡排序

  • 时间复杂度:O(n2)
c++ 复制代码
#include<bits/stdc++.h>
using namespace std;
#define MAXN 1000
int a[MAXN], n;
void BubbleSort(int a[], int n){
    //n-1趟排序
    for(int i = 1; i < n; i++){
        bool ans = false;
        for(int j = n; j > i; j--){
            //交换相邻位置逆序数,将最小数冒泡到未排序序列的最前方
            if(a[j] < a[j-1]){
                swap(a[j],a[j-1]);
                ans = true;
            }
        }
        //无交换发生,已经有序,直接结束
        if(ans == false){
            return;
        }
    }
}
int main()
{
    cin >>n;
    for(int i = 1; i <= n; i++){
        cin >>a[i];
    }
    BubbleSort(a,n);

    for(int i = 1; i <= n; i++){
        cout <<a[i] <<" ";
    }
    return 0;
}

选择排序

  • 时间复杂度:O(n2)
c++ 复制代码
#include<bits/stdc++.h>
using namespace std;
#define MAXN 1000
int a[MAXN], n;
void SelectSort(int a[], int n){
    for(int i = 1; i < n; i++){
        //取出未排序序列中的最小数
        int minnum = 0x3ff, minn = 0;
        for(int j = i; j <= n; j++){    
            if(a[j] < minnum){
                minnum = a[j];
                minn = j;
            }
        }
        //将选出的数放到合适位置
        swap(a[i],a[minn]);
    }
}
int main()
{
    cin >>n;
    for(int i = 1; i <= n; i++){
        cin >>a[i];
    }
    SelectSort(a,n);

    for(int i = 1; i <= n; i++){
        cout <<a[i] <<" ";
    }
    return 0;
}

插入排序

  • 时间复杂度:O(n2)
直接插入排序
c++ 复制代码
#include<bits/stdc++.h>
using namespace std;
#define MAXN 1000
int a[MAXN], n;
void InsertSort(int a[], int n){
    int i, j, temp;
    for(i = 2; i <= n; i++){
        //寻找未排序的第一个逆序数
        if(a[i-1] > a[i]){
            //拿出该数
            temp = a[i];
            //给即将插入的数腾出对应的位置
            for(j = i; (j>1) && (a[j-1]>temp); j--){
                a[j] = a[j-1];
            }
            //插入该数
            a[j] = temp;
        }
    }
}
int main()
{
    cin >>n;
    for(int i = 1; i <= n; i++){
        cin >>a[i];
    }
    InsertSort(a,n);

    for(int i = 1; i <= n; i++){
        cout <<a[i] <<" ";
    }
    return 0;
}
折半插入排序
c++ 复制代码
#include<bits/stdc++.h>
using namespace std;
int a[100001], n;

void InsertSort(int a[], int n){
    int i, j, l, r, mid;
    for(i = 2; i <= n; i++){
        a[0] = a[i];
        l = 1, r = i-1;
        while(l <= r){
            mid = (l + r) / 2;
            if(a[mid] > a[0]) r = mid - 1;
            else l = mid + 1;
        }
        for(j = i - 1; j >= r+1; j--){
            a[j+1] = a[j];
        }
        a[r+1] = a[0];
    }
}

int main(){
    cin >>n;
    for(int i = 1; i <= n; i++){
        cin >>a[i];
    }   
    InsertSort(a,n);
    for(int i = 1; i <= n; i++){
        cout <<a[i] <<" ";
    }
}

希尔排序

  • 时间复杂度:O(n1.3)-O(n2)
c++ 复制代码
#include<bits/stdc++.h>
using namespace std;
#define MAXN 1000
int a[MAXN], n;
void ShellSort(int a[], int n){
    int i, j, temp;
    //对半式增量
    for(int mid = n/2; mid > 0; mid/=2){
        //插入排序
        for(i = mid; i <= n; i++){
            temp = a[i];
            for(j = i; j > mid; j -= mid){
                if(a[j-mid] > temp){
                    a[j] = a[j-mid];
                }else{
                    break;
                }
            }
            a[j] = temp;
        }
    }
}
int main()
{
    cin >>n;
    for(int i = 1; i <= n; i++){
        cin >>a[i];
    }
    ShellSort(a,n);

    for(int i = 1; i <= n; i++){
        cout <<a[i] <<" ";
    }
    return 0;
}

快速排序

  • 最优时间复杂度:O(nlogn)
  • 最坏时间复杂度:O(n2)
c++ 复制代码
#include<bits/stdc++.h>
using namespace std;
int a[100001], n;
int part(int a[], int low, int high){
    int l = low, r = high, pivot = a[l];
    while(l < r){
        while(l < r && pivot < a[r]) r--;
        if(l < r){
            swap(a[l],a[r]);
            l++;
        }
        while(l < r && pivot > a[l]) l++;
        if(l < r){
            swap(a[l],a[r]);
            r--;
        }
    }
    //返回基准点所在位置
    return l;
}
void QuickSort(int a[], int low, int high){
    int mid;
    if(low < high){
        //将比基准点大的数放到右边,比基准点小的数放到左边,并返回基准点位置
        mid = part(a, low, high);
        //递归左边
        QuickSort(a, low, mid-1);
        //递归右边
        QuickSort(a, mid+1, high);
    }
}
int main(){
    cin >>n;
    for(int i = 1; i <= n; i++){
        cin >>a[i];
    }   
    QuickSort(a,1,n);
    for(int i = 1; i <= n; i++){
        cout <<a[i] <<" ";
    }
}

归并排序

  • 时间复杂度:O(nlogn) (最好=最坏=平均)
c++ 复制代码
#include<bits/stdc++.h>
using namespace std;
int a[100001], n;

void MergeSort(int a[], int l, int r){
    int b[100001];
    //递归到只有一个元素,直接返回
    if(l == r) return;
    int mid = (l+r)/2;
    MergeSort(a,l,mid);
    MergeSort(a,mid+1,r);
    //合并序列
    int p = l, q = mid + 1;
    for(int i = l; i <= r; i++){
        if(q > r || (p <= mid && a[p] <= a[q])){
            b[i] = a[p++];
        }else{
            b[i] = a[q++];
        }
    }
    //还原到a数组里
    for(int i = l; i <= r; i++) a[i] = b[i];
}

int main(){
    cin >>n;
    for(int i = 1; i <= n; i++){
        cin >>a[i];
    }   
    MergeSort(a,1,n);
    for(int i = 1; i <= n; i++){
        cout <<a[i] <<" ";
    }
}

堆排序

  • 时间复杂度:O(nlogn)
c++ 复制代码
#include <bits/stdc++.h>
using namespace std;
int a[100001], n;
//将以k为根的子树调整为大根堆
void HeadAdJust(int a[], int k, int len){
    int root = a[k]; //暂存当前根
    for(int i = 2*k; i <= len; i *= 2){
        //挑选出节点的左右孩子中较大的一个
        if(i < len && a[i] < a[i+1]){ i++; }
        //满足大根堆要求,结束
        if(root >= a[i]) break;
        else{
            //不满足大根堆,交换结点
            a[k] = a[i];
            //继续向下建堆
            k = i;  
        } 
    }
    //将原根放入合适位置
    a[k] = root;

}
//建堆
void BuildMaxHeap(int a[], int len){
    for(int i = len/2; i > 0; i--){
        HeadAdJust(a,i,len);
    }
}
void HeadSort(int a[], int len){
    BuildMaxHeap(a,len);
    //n-1趟排序
    for(int i = len; i > 1; i--){
        //把根放到已排序序列中
        swap(a[i], a[1]);
        //继续建堆寻找最大元素
        HeadAdJust(a,1,i-1);
    }
}
int main()
{
    cin >>n;
    for(int i = 1; i <= n; i++){
        cin >>a[i];
    }
    HeadSort(a,n);
    for(int i = 1; i <= n; i++){
        cout <<a[i] <<" ";
    }
    return 0;
}
相关推荐
JeffersonZU3 分钟前
【数据结构】2-3-2 单链表的插入删除
数据结构
m0_738206548 分钟前
嵌入式学习的第二十二天-数据结构-栈+队列
数据结构·学习
远瞻。1 小时前
【论文阅读】人脸修复(face restoration ) 不同先验代表算法整理2
论文阅读·算法
先做个垃圾出来………4 小时前
哈夫曼树(Huffman Tree)
数据结构·算法
phoenix@Capricornus6 小时前
反向传播算法——矩阵形式递推公式——ReLU传递函数
算法·机器学习·矩阵
Inverse1626 小时前
C语言_动态内存管理
c语言·数据结构·算法
数据与人工智能律师6 小时前
虚拟主播肖像权保护,数字时代的法律博弈
大数据·网络·人工智能·算法·区块链
wuqingshun3141597 小时前
蓝桥杯 16. 外卖店优先级
c++·算法·职场和发展·蓝桥杯·深度优先
YouQian7727 小时前
2025春训第十九场
算法
CodeJourney.7 小时前
基于MATLAB的生物量数据拟合模型研究
人工智能·爬虫·算法·matlab·信息可视化