1.选择排序

含义:对一个序列 A 中的元素 A[1] ~ A[n] ,令 i 从 1 到 n 枚举,进行 n 趟操作,每趟从待排序部分 [i, n] 中选择最小的元素,令其与待排序部分的第一个元素 A[i] 进行交换,这样元素 A[i]就会与当前有序区间 [1, i -1]形成新的有序区间 [1, i]。
示意图:
image.png
代码:(复杂度:O(n^2) )

#include <cstdio>

void select_sort(int a[], int n)
{
    for (int i = 0; i < n; i ++)
    {
        int k = i;
        for (int j = i; j < n; j ++)
        {
            if (a[j] < a[k])
                k = j;
        }
        int temp = a[k];
        a[k] = a[i];
        a[i] = temp;
    }
}

int main()
{
    int a[5] = {5, 4, 3, 2, 1};
    int len = sizeof(a) / sizeof(int);
    
    select_sort(a, len);
    
    for (int i = 0; i < len; i ++)
        printf("%d ", a[i]);
    
    return 0;
}

2.插入排序

含义: 对序列 A 的 n 个元素A [1] ~ A[n],令 i 从 2 到 n 枚举,进行 n - 1 趟操作。假设某一趟是,序列 A 的前 n 个元素 A[1] ~ A[i - 1]已经有序,而范围 [i, n]还未有序,那么该趟从范围 [1, i - 1] 中寻找某个位置 j ,使得将 A[i] 插入位置 j 后(A[j] 之后的元素都会后移一位),范围 [1, i] 有序。
示意图:
image.png
代码:

#include <cstdio>

void insert_sort(int a[], int n)
{
    for (int i = 1; i < n; i ++)
    {
        int temp = a[i], j = i; // temp 临时存放a[i], j 从 i 开始向前枚举
        while(j > 0 && temp < a[j - 1])
        {
            a[j] = a[j - 1];
            j --;
        }
        a[j] = temp;
    }
}

int main()
{
    int a[5] = {5, 4, 3, 2, 1};
    
    int len = sizeof(a) / sizeof(int);
    
    insert_sort(a, len);
    for (int i = 0; i < len; i ++ )
        printf("%d ", a[i]);
    
    return 0;    
}

3.冒泡排序

含义:在一个序列中,从首元素开始,进行两两互换使最大的元素放在序列的最后。这样 n 个元素的序列需要进行 n - 1 趟交换。第一趟交换的次数是 n - 1 次,第二趟交换的次数是 n - 2 次...则第 i 趟交换的次数是 n - i 次。
代码:

#include <cstdio>

void bubble_sort(int a[], int n)
{
    for (int i = 0; i < n - 1; i ++)
        for (int j = 0; j < n - i - 1; j ++)
            if (a[j] > a[j + 1])
            {
                int temp = a[j];
                a[j] = a[j + 1];
                a[j + 1] = temp;
            }
}

int main()
{
    int a[5] = {5, 4, 3, 2, 1};
    
    int len = sizeof(a) / sizeof(int);
    bubble_sort(a, len);
    
    for (int i = 0; i < len; i ++)
        printf("%d ", a[i]);
    
    return 0;
}
参考资料《算法笔记》胡凡.

雨天
0 声望3 粉丝

独自灿烂