FDS(一):排序算法
FDS之排序算法
前言
以排序算法作为起始,我也不知道合不合适
排序问题有许多有趣的算法解决方案,体现了许多计算机科学的思想:
- 比较和非比较的策略
- 迭代与递归实现
- 分治范式(例如,并归排序或快速排序)
- 最好/最坏/平均时间复杂度分析
- 随机算法
本文将实现:
- 基于比较的排序算法:
- BUB 冒泡排序
- SEL 选择排序
- INS 插入排序
- MER 并归排序(递归实现)
- QUI 快速排序 (递归实现)
- R-Q 随机快速排序 (递归实现)
 
- 不基于比较的排序算法:
- COU 计数排序
- RAD 基数排序
 
关于算法的稳定性:我之前一直有一个误区:以为是不一定能排序成功所以叫做不稳定排序,实际上都是能排成功的。
那什么是稳定性呢?简单地说就是所有相等的数经过某种排序方法后,仍能保持它们在排序之前的相对次序,我们就说这种排序方法是稳定的。反之,就是非稳定的。
1 基于比较的排序算法
BUB,SEL,INS 最容易实现,但不是效率最高的,他们的时间复杂度是O(N^2^)
1.1 冒泡排序
算法时间复杂度
 最坏情况:O(n^2)
 最好情况:O(n)
 平均情况:O(n^2)
算法空间复杂度:S(n)=O(1)
算法稳定性:稳定排序
#include<stdio.h>
int main()
{
    int n,num[100];
    int i,j,temp;
    while(scanf("%d",&n)!=EOF)//这一行语句非常有意义
    {
        for(i = 0;i < n;i++)
            scanf("%d",&num[i]);
        for(i = 0;i < n - 1;i++)
            for(j = 0;j < n - i - 1;j++)//优化,因为最后一位在一轮冒泡后一定处于正确的位置
            {
                if(num[j] > num[j + 1])
                {
                    temp = num[j];
                    num[j] = num[j + 1];
                    num[j + 1] = temp;
                }
            }
        for(i = 0;i < n;i++)
        {
            printf("%d ",num[i]);
        }
        printf("\n");
    }
    return 0;
}1.2 选择排序
算法时间复杂度
 最坏情况:O(n^2)
 最好情况:O(1) //即不需要排序,本身已是正序
 平均情况:O(n^2)
算法空间复杂度:S(n)=O(1)
算法稳定性:不稳定排序
#include<stdio.h>
int main()
{
    int a[10];
    int i=0;
    for(i=0;i<10;i++)
    scanf("%d",&a[i]);
    for(int i = 0;i<10;i++ )
    {
        int temp = i;           //就是从第一个开始,寻找每个[i,10]区间上的最小值,并且与i交换
        for(int j =i;j<10;j++)
        {
            if(a[temp]>a[j])
            {
                temp = j;    //temp用于记录其最小值的位置
            }
        }
        if(temp!=i)
        {
            int t = a[i];
            a[i] = a[temp];
            a[temp] = t;
        }
    }
    for(int i = 0;i<10;i++)
    printf("%d\n",a[i]);
}1.3 插入排序
算法时间复杂度
 最坏情况:O(n^2)
 最好情况:O(n)
 平均情况:O(n^2)
算法空间复杂度:S(n)=O(1)
算法稳定性:稳定排序
FDS(一):排序算法
      http://pikapikagfy.github.io/2024/01/20/FDS-1/