几个排序算法

1.插入排序

希尔排序

不稳定

  • 用元素个数/2 然后得到一个步长 步长之间两两为一组(8个元素那就是4)

  • 然后将他们两两比较,大的放后面小的放前面,得到一个序列

  • 再让步长除以(4/2=2) 步长为2 再分两组

第二趟

第三趟如果还是乱序

那就再除以2 2/2变1 然后两两比较 最后得到一个有序序列

cpp 复制代码
void ShellSort(int arr[], int sz)
{
    int d, i, j;
    //d表示步长,比如8个元素,那就arr[0]和arr[3]比较
    //比较完一次再将步长/2不断缩小
        for (d = sz / 2; d >= 1; d = d / 2)
        {
            // 对每个子序列进行插入排序
            for (i = d; i < sz; i++)
            {
                int temp = arr[i]; // 保存当前元素
                // 插入排序逻辑
                for (j = i - d; j >= 0 && temp < arr[j]; j = j - d)
                {
                    arr[j + d] = arr[j]; // 将较大的元素向后移动
                }
                arr[j + d] = temp; // 插入当前元素到正确位置
            }
        }
    }
​

直接插入排序

cpp 复制代码
//直接插入排序
//1.i从1开始往后遍历
//2.元素两两比较 如果前一个元素大于后一个
//3.将后一个元素保存到temp 前面的元素往后移动
//4.最后将temp赋值给arr[j+1]
void InsertSort(int arr[], int sz)
{
    int i, j, temp;
    for ( i = 1; i < sz; i++)
    {
        if (arr[i] < arr[i - 1])
            
        {
             temp = arr[i];
            //i-1表示当前元素和前一个元素比
            for ( j = i - 1; j >= 0 && temp < arr[j]; j--)
            {   //将元素往后移动
                arr[j + 1] = arr[j];
            }
            arr[j + 1] = temp;
        }
    }
}

2.交换排序

冒泡排序

  • 通过 flag 提前结束排序,提高了算法的效率。

  • 最好情况(数组已经有序):时间复杂度为 O(n)O(n),只需要一轮比较。

  • 最坏情况(数组完全逆序):时间复杂度为 O(n2)O(n2),需要 n−1轮比较和交换。

cpp 复制代码
BubbleSort(int arr[], int sz)
{
    for (int i = 0; i < sz - 1; i++)
    {
        int flag = 0;
        for (int j = 0; j < sz - i - 1; j++)
        {
            if (arr[j] > arr[j + 1])
            {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
                flag = 1;
            }
        }
        if (flag == 0)
            break;
    }
}

快速排序

  • 首先拿出第一个元素作为基准,那么第一个位置就空出来了

  • 然后从右往左 和 基准元素进行比较

  • 比基准元素小的就放到arr[0]的位置,反之该元素不动

  • high--不断往左,low++不断往前直到最后两个相遇

  • 第一趟排序后 将一个序列分成两个子序列 不断重复上述步骤(递归)

cpp 复制代码
void QuickSort(int arr[], int low, int high)
{
    if (low < high)
    {   //pivotpos记录基准的位置,将该序列分成两部分
        int pivotpos = Partition(arr, low, high);
        //左部分,不断递归调用进行排序
        QuickSort(arr, low, pivotpos - 1);
        //右部分
        QuickSort(arr, pivotpos+1, high);
    }
}
int Partition(int arr[], int low, int high)
{
    //将第一个元素作为中心点拿出来
    //和其他元素进行比较
    int pivot = arr[low]; 
    while (low<high)
    {   //该判断语句表示在右边的元素大于基准元素
        //则不用动 high减一
        while (low < high && arr[high] >= pivot)
            high--;
        //直到找到比较小的元素就将该元素赋值给low
        arr[low] = arr[high];
        while (low < high && arr[low] <= pivot)
        
            low++;
        arr[high] = arr[low];
    }
    arr[low] = pivot;
    return low;
}
相关推荐
机器学习之心4 小时前
多目标鲸鱼优化算法(NSWOA),含46种测试函数和9个评价指标,MATLAB实现
算法·matlab·多目标鲸鱼优化算法·46种测试函数·9个评价指标
古译汉书4 小时前
嵌入式铁头山羊STM32-各章节详细笔记-查阅传送门
数据结构·笔记·stm32·单片机·嵌入式硬件·个人开发
max5006005 小时前
基于Meta Llama的二语习得学习者行为预测计算模型
人工智能·算法·机器学习·分类·数据挖掘·llama
超级大福宝5 小时前
使用 LLVM 16.0.4 编译 MiBench 中的 patricia遇到的 rpc 库问题
c语言·c++
橘颂TA6 小时前
【数据结构】解锁数据结构:通往高效编程的密钥
数据结构
王哥儿聊AI6 小时前
Lynx:新一代个性化视频生成模型,单图即可生成视频,重新定义身份一致性与视觉质量
人工智能·算法·安全·机器学习·音视频·软件工程
手握风云-7 小时前
优选算法的寻踪契合:字符串专题
算法
闭着眼睛学算法7 小时前
【华为OD机考正在更新】2025年双机位A卷真题【完全原创题解 | 详细考点分类 | 不断更新题目 | 六种主流语言Py+Java+Cpp+C+Js+Go】
java·c语言·javascript·c++·python·算法·华为od
IT古董7 小时前
【第五章:计算机视觉-项目实战之目标检测实战】2.目标检测实战:中国交通标志检测-(2)中国交通标志检测数据格式转化与读取
算法·目标检测·计算机视觉
MobotStone8 小时前
LLM 采样入门到进阶:理解与实践 Top-K、Top-P、温度控制
算法