排序和查找算法:插入排序、希尔排序、快速排序以及二分查找

一、排序和查找算法

|------|----------|-----|
| 名称 | 时间复杂度 | 稳定性 |
| 冒泡排序 | O(n^2) | 稳定 |
| 选择排序 | O(n^2) | 不稳定 |
| 插入排序 | O(n^2) | 稳定 |
| 希尔排序 | O(nlogn) | 不稳定 |
| 快速排序 | O(nlogn) | 不稳定 |

在排序之前我们先利用srand(time(NULL))函数生成随机数种子

cpp 复制代码
int InputArarry(int parray, int len)
{
    int i = 0;
    srand(time(NULL));
    
    for(i = 0; i < len; i++)
    {
        parray[i] = rand() % (len * 100);
    }

    return 0;
}

1.冒泡排序

相邻两个元素比较,大的一点点向后走,小的一点点向前走

关键代码示例:

cpp 复制代码
int BubbleSort(int parray, int len)
{
    int i = 0;
    int j = 0;
    int tmp = 0;

    for(j = 0; j < len-1; j++)
    {
        for(i = 0; i < len-1-j; i++)
        {
            if(parray[i] > parray[i+1])
            {
                tmp = parray[i];
                parray[i] = parray[i+1];
                parray[i+1] = tmp;
            }
        }
    }

    return 0;
}

2.选择排序

定义最小值下标,循环遍历比较,更新最小值下标,再交换数值

关键代码示例:

cpp 复制代码
int SelectSort(int parray, int len)
{
    int i = 0;
    int j = 0;
    int Min = 0;
    int tmp = 0;

    for(j = 0; j < len-1; j++)
    {
        Min = j;
        for(i = j+1; i < len; i++)
        {
            if(parray[i] < parray[Min])
            {
                Min = i;
            }
        }

        if(Min != j)
        {
            tmp = parray[j];
            parray[j] = parray[Min];
            parray[Min] = tmp;
        }
    }

    return 0;
}

3.插入排序

数据排列大致有序的场合下便于使用插入排序,将第一个元素看作一个有序数列,插入元素在这个有序数列中。

  • 先将要插入的数据取出放入tmp;
  • 前一个数据与tmp比较;
  • 前一个数据大于tmp时,交换。

关键代码示例:

cpp 复制代码
int InsertSort(int parray, int len)
{
    int i = 0;
    int j = 0;
    int tmp = 0;
    
    for(j = 1; j < len; j++)
    {
        tmp = parray[j];
        for(i = j; i > 0 && parray[i-1] > tmp; i--)
        {
            parray[i] = parray[i-1];
        }
        parray[i] = tmp;
    }

    return 0;
}

4.希尔排序

基于插入排序的思想,在插入排序之前,将序列排成大致有序的数列,再整体进行插入排序

  • 数组长度的一半作为步长,按步长将数组划分为几个小的数组;
  • 划分后进行插入排序,直到不能划分后排序完成;(len / 2 == 0时无法再划分)

图示:

关键代码示例:

cpp 复制代码
int SellSort(int parray,int len)
{
    int i = 0;
    int j = 0;
    int step = 0;
    int tmp = 0;

    for(step = len / 2 ; step > 0; step /= 2)
    {
        for(j = step; j < len; j++)
        {
            tmp = parray[j];
            for(i = j; i > step-1 && parray[i-step] > tmp; i -= step)
            {
                parray[i] = parray[i-step]
            }
            parray[i] = tmp;
        }
    }

    return 0;
}

5.快速排序

  • 选择最左边的数作为键值;
  • 从后面选一个比键值小的数放前面;
  • 从前面选一个比键值大的数放后面;
  • 最终两个箭头相遇的位置放入键值,循环操作以上步骤,直到排序完成

图示:

关键代码示例:

cpp 复制代码
int QuickSort(int parray, int Low, int High)
{
    int i = 0;
    int j = 0;
    int key = 0;

    i = Low;
    j = High;
    key = parray[Low];

    while(i < j)
    {
        while(i < j && parray[j] >= key)
        {
            j--;
        }
        parray[i] = parray[j];

        while(i < j && parray[i] <= key)
        {
            i++;
        }
        parray[j] = parray[i];
    }
    parray[i] = key;

    if(Low < i-1)
    {
        QuickSort(parray, Low, i-1);
    }
    if(i+1 < High)
    {
        quickSort(parray, i+1, High);
    }

    return 0;
}

二、二分查找(折半查找)

前提是数据排列必须有序;时间复杂度为O(logn)

图示:

关键代码示例:

cpp 复制代码
int MidSearch(int parray, int Low, int High, int TmpData)
{
    int Mid = 0;

    if(Low > High)
    {
        return -1;
    }
    Mid = (Low + High) / 2;

    if(parray[Mid] < TmpData)
    {
        return MidSearch(parray, Mid+1, High, Tmpdata);
    }
    else if(parray[Mid] > Tmpdata)
    {
        return MidSearch(parray, Low, Mid-1, TmpData);
    }
    else if(parray[Mid] == Tmpdata)
    {
        return Mid;
    }
}
相关推荐
CV-Climber11 分钟前
检索技术的实际应用
人工智能·算法
hhzz1 小时前
Tiger AI Platform平台中增加人脸识别功能
图像处理·人工智能·算法·计算机视觉·大模型
从零开始的代码生活_1 小时前
C++ 继承详解:访问控制、对象模型、菱形继承与设计取舍
开发语言·c++·后端·学习·算法
TsingtaoAI2 小时前
3D高斯泼溅技术发展及其在具身智能领域的应用综述
人工智能·算法·ai·具身智能·高斯泼溅
atunet2 小时前
关于图算法中的连通分量检测与最小割问题7
算法
心运软件2 小时前
银行客户流失预测(Python 完整实战)
算法
邪神与厨二病3 小时前
牛客周赛 Round 153
python·算法
qizayaoshuap4 小时前
# ❌ 井字棋 — 鸿蒙ArkTS Minimax AI算法与博弈系统设计
人工智能·算法·华为·harmonyos
皓月斯语5 小时前
B3842 [GESP202306 三级] 春游 题解
数据结构·c++·算法·题解
atunet5 小时前
树状结构在查询优化中的作用与实现细节7
算法