学不会的排序算法

clear_tea / 2023-06-30 / 原文

什么是排序

所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。排序算法,就是如何使得记录按照要求排列的方法。

排序算法的评价标准

(1)时间复杂度(2)空间复杂度(3)排序方式(4)稳定性

废话不多说,我们直接开始吧

选择排序

选择排序(Selection sort)是一种比较简单的排序方式,工作原理是:从待排序的数据中找到,最小(或最大)的数据,将其放在第一个位置;再从剩下的待排序的数据中找到最小(或最大)的数据,将其放在这些数据的第一个位置;直到待排序的数据为零。

原理比较简单,这里就不过多描述,直接附上代码:

#include <iostream>
#define int long long
signed main() {
    int n,min;
    std::cin>>n;
    int a[n + 1];
    for(int i  = 1;i <= n;i ++){//读入要排序的数据
        std::cin>>a[i];
    }
    for(int i = 1;i < n;i ++){
        min = i;
        for(int j = i + 1;j <= n;j ++){//遍历一次a[i]后面的数,找到最小值
            if(a[j] < a[min]){
                min = j;
            }
        }
        //将本次找到的最小值与a[i]交换
        int t = a[i];
        a[i] = a[min];
        a[min] = t;
    }
    for(int i = 1;i <= n;i ++){//遍历输出
        std::cout<<a[i]<<" ";
    }
    return 0;
}

冒泡排序

冒泡排序(Bubble Sort)也是比较基础简单的排序,工作原理就是从第一个位置开始,依次比较两个相邻的元素,如果它们的顺序是错误的,就交换过来,直到没有相邻的元素需要交换,就像气泡慢慢上浮,就像冒泡一样。

原理也比较简单,上代码

#include <iostream>
#define int long long
signed main() {
    int n;
    std::cin>>n;
    int a[n + 1];
    for(int i = 1;i <= n;i ++){
        std::cin>>a[i];
    }
    for(int i = 1;i < n;i ++){
        for(int j = 1;j <= n - i;j ++){
            if(a[j] > a[j + 1]){//如果相邻元素的顺序不对,进行交换
                int t = a[j];
                a[j] = a[j + 1];
                a[j + 1] = t;
            }
        }
    }
    for(int i = 1;i <= n;i ++){//遍历输出
        std::cout<<a[i]<<" ";
    }
    return 0;
}

插入排序

插入排序(Insertion sort)插入排序是一种简单的排序方法,基本思想是将一个元素插入到一个有序的数据中,从而一个新的,长度增加1的数据,从第二个元素开始,在当前元素位置前面的有序数据中寻找合适的位置(即第i个数据比待插入的元素小,第i + 1个数据比待插入元素大),直到排序完成。

原理依旧比较简单上代码

#include <iostream>
#define int long long
signed main() {
    int n;
    std::cin>>n;
    int a[n + 1];
    for(int i = 1;i <= n;i ++){
        std::cin>>a[i];
    }
    for(int i = 2;i <= n;i ++){
        int t = a[i];//记录待插入元素的值
        int j = i - 1;
        while(t > a[j]){
            a[j + 1] = a[j];
            j -- ;
        }
        a[j + 1] = t;
    }
    for(int i = 1;i <= n;i ++){//遍历输出
        std::cout<<a[i]<<" ";
    }
    return 0;
}

未完,再续……