首页 > 编程语言 >十大排序算法

十大排序算法

时间:2023-05-04 22:14:10浏览次数:44  
标签:std arr include 十大 int 算法 vector && 排序

0、算法分类

  • 十种常见排序算法可以分为两类

    • 比较类排序 通过比较来决定元素间的相对次序,时间复杂度为 O(nlogn)~O(n²)
    • 非比较类排序 不通过比较来决定元素间的相对次序,其时间复杂度可以突破 O(nlogn),以线性时间运行

  • 名次解释:

    时间/空间复杂度:描述一个算法执行时间/占用空间与数据规模的增长关系。

    • n:待排序列的个数。

    • k:“桶”的个数(上面的三种非比较类排序都是基于“桶”的思想实现的)。

    • In-place:原地算法,指的是占用常用内存,不占用额外内存。空间复杂度为 O(1) 的都可以认为是原地算法。

    • Out-place:非原地算法,占用额外内存。

    • 稳定性:假设待排序列中两元素相等,排序前后这两个相等元素的相对位置不变,则认为是稳定的。

1、冒泡排序

#include <iostream>
#include <vector>
using std::vector;

void bubbleSort(vector<int>&&arr)
{
    int n = arr.size();
    bool flag = false;

    for (int i = 0; i < n - 1; ++i)
    {
        flag = false;
        for (int j = 0; j < n - i - 1; ++j)
        {
            if(arr[j] > arr[j+1])
            {
                std::swap(arr[j], arr[j+1]);
                flag = true;
            }
        }
        if(!flag) break;
    }

    for(auto&& x : arr)
    {
        std::cout<< x <<",";
    }
    std::cout<<std::endl;
}

int main ()
{
    bubbleSort(vector<int>{1,2,3,4,5});
    bubbleSort(vector<int>{1,3,2,4,5});
    bubbleSort(vector<int>{5,4,3,2,1});
    bubbleSort(vector<int>{1,5,2,4,3});
}

2、选择排序

#include <iostream>
#include <vector>
using std::vector;

void selectSort(vector<int>&& arr)
{
    int n = arr.size();
    int minIndex = 0;
    for (int i = 0; i < n-1; ++i)
    {
        minIndex = i;
        for (int j = i + 1; j < n; ++j)
            if(arr[j] < arr[minIndex]) minIndex = j;
z
        if(minIndex != i) std::swap(arr[i], arr[minIndex]);
    }

    for(auto&& x : arr)
    {
        std::cout<< x <<",";
    }
    std::cout<<std::endl;
}

int main ()
{
    selectSort(vector<int>{1,2,3,4,5});
    selectSort(vector<int>{1,3,2,4,5});
    selectSort(vector<int>{5,4,3,2,1});
    selectSort(vector<int>{1,5,2,4,3});
}

3、插入排序

#include <iostream>
#include <vector>
using std::vector;

void insertSort(vector<int> arr)
{
    int n = arr.size();
    int i, j, temp;
    for (i = 1; i < n; ++i)
    {
        temp = arr[i];

        for (j = i; j > 0 && arr[j - 1] > temp; --j)
            arr[j] = arr[j - 1];

        arr[j] = temp;
    }

    for(auto&& x : arr)
    {
        std::cout<< x <<",";
    }
    std::cout<<std::endl;
}
int main ()
{
    insertSort(vector<int>{1,2,3,4,5});
    insertSort(vector<int>{1,3,2,4,5});
    insertSort(vector<int>{5,4,3,2,1});
    insertSort(vector<int>{1,5,2,4,3});
}

4.希尔排序

#include <iostream>
#include <vector>
using std::vector;

void shellSort(vector<int> arr)
{
    int n = arr.size();

    int i, j , gap, temp;

    for(gap = n / 2; gap > 0; gap/=2)
    {
        for (i = gap; i< n; ++i)
        {
            temp = arr[i];
            for (j = i - gap; j>=0 && temp < arr[j]; j-=gap)
            {
                arr[j + gap] = arr[j];
            }
            arr[j + gap] = temp;
        }
    }

    for(auto&& x : arr)
    {
        std::cout<< x <<",";
    }
    std::cout<<std::endl;
}

int main ()
{
    shellSort(vector<int>{1,2,3,4,5});
    shellSort(vector<int>{1,3,2,4,5});
    shellSort(vector<int>{5,4,3,2,1});
    shellSort(vector<int>{1,5,2,4,3});
}

5、归并排序

#include <iostream>
#include <vector>
using std::vector;

void merge(vector<int>& arr, int l, int r, int mid)
{
    int leftSize = mid - l + 1;
    int rightSize = r - mid;

    vector<int> left(arr.begin() + l, arr.begin() + mid + 1);
    vector<int> right(arr.begin() + mid + 1, arr.begin() + r + 1);

    int i =0, j = 0, k = l;

    while (i<leftSize && j<rightSize) arr[k++] = left[i] < right[j] ? left[i++] : right[j++];
    while (i<leftSize ) arr[k++] = left[i++];
    while (j<rightSize ) arr[k++] = right[j++];
}
void mergeSort(vector<int>&arr, int l, int r)
{
    if(l == r) return;

    int mid = (l + r) / 2;

    mergeSort(arr, l, mid);
    mergeSort(arr, mid + 1, r);

    merge(arr, l , r, mid);
}

void print(vector<int>& arr)
{
    for(auto&& x : arr)
    {
        std::cout<< x <<",";
    }
    std::cout<<std::endl;
}
int main()
{
    vector<int> v1{1,2,3,4,5};
    mergeSort(v1,0, v1.size() - 1);
    print(v1);

    vector<int> v2{1,3,2,4,5};
    mergeSort(v2,0, v2.size() - 1);
    print(v2);

    vector<int> v3{5,4,3,2,1};
    mergeSort(v3,0, v3.size() - 1);
    print(v3);

    vector<int> v4{1,5,2,4,3};
    mergeSort(v4,0, v4.size() - 1);
    print(v4);

}

标签:std,arr,include,十大,int,算法,vector,&&,排序
From: https://www.cnblogs.com/scyrc/p/17372372.html

相关文章

  • 20 年前,亚马逊就推出了大数据杀熟算法
    By超神经内容提要:近年来,大数据「杀熟」已经成为互联网商家被公开的秘密,这一行为深受广大用户诟病。不过,根据文旅局最新发布的规定,大数据「杀熟」行为将于 10月1日起被明令禁止。关键词:大数据杀熟价格歧视OTA电商 你有过被大数据「杀熟」的经历吗?去年3月,北京市消费者协会......
  • 数组排序输出(函数模板)
    一、问题描述:对于输入的每一批数,按从小到大排序后输出。一行输入为一批数,第一个输入为数据类型(1表示整数,2表示字符型数,3表示有一位小数的浮点数,4表示字符串,0表示输入结束),第二个输入为该批数的数量size(0<size<=10),接下来为size个指定类型的数据。输出将从小到大顺序输出数据。函......
  • 1-ORB-SLAM3论文重点导读及整体算法流程梳理-归纳
    摘要ORB-SLAM3是第一个能够执行纯视觉、视觉-惯导以及多地图的SLAM系统,可以在单目,双目以及RGB-D相机上使用针孔以及鱼眼模型。本文主要新颖之处在于基于特征的VIO紧耦合系统,该系统完全依赖于最大后验估计,即使在IMU初始化阶段也是如此。本系统在小型和大型、室内和室外环境中实时......
  • 雷达校招 | 往年雷达算法校招笔试题分析
    公众号【调皮连续波】,2023年度会员内容更新公告(04.10)序号类别内容文件路径1雷达工具雷达工具箱MATLAB源码\根目录\雷达工具箱【正文】编辑|小助理 审核|调皮哥1、2016年5月美国佛罗里达州发生的特斯拉自动驾驶第一起命案,当时Models行驶在一条双向、有中央隔离带的公路上,自动驾驶......
  • 基于EKF扩展卡尔曼滤波算法的永磁同步电机PMSM无传感器矢量控制Simulink仿真模型。
    基于EKF扩展卡尔曼滤波算法的永磁同步电机PMSM无传感器矢量控制Simulink仿真模型。1.依据PMSM的数学模型搭建电机模型2.双闭环dq解耦控制,转速外环,转矩内环3.EKF算法对电机的转子电角度和机械转速进行估算ID:2465668485383219......
  • 永磁同步电机的MRAS模型参考自适应控制算法,matlab,仿真模型。
    永磁同步电机的MRAS模型参考自适应控制算法,matlab,仿真模型。ID:4365667815721072......
  • 异步电机的无传感器矢量控制,matlab,仿真模型,控制算法为MRAS模型参考自适应。
    异步电机的无传感器矢量控制,matlab,仿真模型,控制算法为MRAS模型参考自适应。ID:44100668158918155......
  • C++黑马程序员——P251-254. 常用排序算法 sort,random_shuffle,merge,reverse
    P251.常用排序算法——sortP252....——random_shuffleP253....——mergeP254....——reverseP251.sort  1#include<iostream>2#include<vector>3#include<algorithm>4#include<functional>//用greater5usingnamespacest......
  • 基于迭代混沌映射的麻雀搜索算法-附代码
    基于迭代混沌映射的麻雀搜索算法文章目录基于迭代混沌映射的麻雀搜索算法1.迭代映射2.基于迭代映射的麻雀搜索算法3.算法结果:4.Matlab5.python1.迭代映射迭代映射是混沌映射的典型代表,它的数学形式很简单。其表达式如下:迭代表达式中a的范围为[0,1],x的范围为[0,1]。迭代映射迭代......
  • 基于莱维飞行和随机游动策略的灰狼算法-附代码
    基于莱维飞行和随机游动策略的灰狼算法文章目录基于莱维飞行和随机游动策略的灰狼算法1.灰狼优化算法2.改进灰狼优化算法2.1分段可调节衰减因子2.2莱维飞行和随机游动策略3.实验结果4.参考文献5.Matlab代码6.python代码摘要:在标准灰狼优化算法寻优的中后期,由于衰减因子减小,......