排序算法:基础入门篇

排序算法:基础入门篇

文章目录:

一、选择排序

1.1 常规选排思路

选择排序算法是排序算法中,最简单直观的排序法,其思路也是简单明了,它的时间复杂度为 O ( n 2 ) O(n^2) O(n2),空间复杂度为 O ( 1 ) O(1) O(1)。选择排序具有不稳定的特点,因此我们在排序量大的时候,尽量不选择选择排序,会导致运行效率大大降低,在比赛中会导致超过时间限制。此算法的基本思路如下:
2 1 1 6 7 5 4 3 8

如图所示,先从数列中找到最小数 1 1 1,将它放到数列的最前端。
1 2 2 6 7 5 4 3 8

继续在数列中寻找最小值,然后放到第二个位置。以此类推,直至将整个数列排序完成。代码如下:

cpp 复制代码
#include <iostream>
using namespace std;
int main(){
    int a[8]={2,1,6,7,5,4,3,8};
    for(int i=0;i<8;i++){
        int num,min=9999;
        for(int j=i;j<8;j++){
            if(a[j]<min){
                num=j;
                min=a[j];
            }
        }
        int temp=a[i];
        a[i]=min;
        a[num]=temp;
    }
    for(int i=0;i<8;i++) cout<<a[i];
    return 0;
}

1.2 优化选排思路

根据上述思路,我们不仅可以将最小的找出来放到最前端,也能将最大的找出来放到最后端,这样运行的效率增快了一倍。
目标数 1 8 2 1 6 7 5 4 3 8

代码如下:

cpp 复制代码
#include <iostream>
using namespace std;
int main(){
    int a[8]={2,1,6,7,5,4,3,8};
    for(int i=0;i<4;i++){
        int num,num_x,min=9999,max=-1;
        for(int j=i;j<8-i;j++){
            if(a[j]<min){
                num=j;
                min=a[j];
            }
            if(a[j]>max){
                num_x=j;
                max=a[j];
            }
        }
        int temp=a[7-i];
        a[7-i]=max;
        a[num_x]=temp;
        temp=a[i];
        a[i]=min;
        a[num]=temp;
    }
    for(int i=0;i<8;i++) cout<<a[i];
    return 0;
}

二、冒泡排序

冒泡排序是通过每次比较相邻数大小,每次将最大的数放到数列末端,从而达到排序目的。它的时间复杂度为 O ( n 2 ) O(n^2) O(n2),空间复杂度为 O ( 1 ) O(1) O(1)。代码如下:

cpp 复制代码
#include <iostream>
using namespace std;
int main(){
    int arr[8]={2,1,6,7,5,4,3,8};
    for(int i = 0; i < 8; i++){
        for(int j = 0; j < 8 - 1 - i; j++){
            if(arr[j] > arr[j+1]){
                int temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
    }
    for(int i = 0;i < 8; i++) cout<< arr[i];
    return 0;
}

三、插入排序

插入排序也是比较好理解的一种排序办法,其主要思路是:在待排序的元素中,假设前 n − 1 n-1 n−1个元素已有序,现将第 n n n个元素插入到前面已经排好的序列中,使得前 n n n个元素有序。按照此法对所有元素进行插入,直到整个序列有序。
步骤一 数组 2 1 1 6 7 5 4 3 8
步骤二 数组 1 1 2 6 7 5 4 3 8

在移位到第一个数也大于目标数的时候,就令 a 0 a_0 a0为目标数值即可。
代码如下:

cpp 复制代码
#include <iostream>
using namespace std;
int main(){
    int a[8]={2,1,6,7,5,4,3,8};
    for(int i=1;i<8;i++){
        int temp=a[i];
        for(int j=i-1;j>=0;j--){
            if(a[j]>temp){
                a[j+1]=a[j];
            }else{
                a[j+1]=temp;
                break;
            }
            if(j==0&&a[1]>temp) a[0]=temp;
        }
    }
    for(int i=0;i<8;i++) cout<<a[i];
    return 0;
}
相关推荐
hweiyu0033 分钟前
C++设计模式,高级开发,算法原理实战,系统设计与实战(视频教程)
c++·算法·设计模式
大千AI助手1 小时前
粒子群优化(PSO)算法详解:从鸟群行为到强大优化工具
人工智能·算法·优化算法·pso·粒子群优化
我叫汪枫1 小时前
C语言深度入门系列:第十一篇 - 动态内存管理与数据结构:程序世界的高效算法大师
c语言·数据结构·算法
Li_7695321 小时前
优选算法100 题 ——1 双指针
算法
77qqqiqi1 小时前
算法——数学基础
算法
啊?啊?1 小时前
7 排序算法通关指南:从 O (n²)(选择 / 冒泡)到 O (nlogn)(快排 / 归并)+ 计数排序
数据结构·算法·排序算法
张较瘦_1 小时前
[论文阅读] 算法 | 抗量子+紧凑!SM3-OTS:基于国产哈希算法的一次签名新方案
论文阅读·算法·哈希算法
芒克芒克2 小时前
LeetCode 面试经典 150 题:多数元素(摩尔投票法详解 + 多解法对比)
算法·leetcode·面试
wow_DG2 小时前
【Vue2 ✨】Vue2 入门之旅 · 进阶篇(二):虚拟 DOM 与 Diff 算法
开发语言·javascript·vue.js·算法·前端框架
和光同尘 、Y_____2 小时前
BRepMesh_IncrementalMesh 重构生效问题
c++·算法·图形渲染