几个排序算法

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;
    }
}

快速排序

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

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

  • 比基准元素小的就放到arr0的位置,反之该元素不动

  • 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;
}
相关推荐
劈星斩月6 分钟前
监督学习算法 之 决策树
学习·算法·决策树
学计算机的计算基11 分钟前
操作系统内存管理全解:虚拟内存、页表、COW、malloc、OOM一篇搞定
java·笔记·算法
tachibana215 分钟前
hot100 前 K 个高频元素(347)
java·数据结构·算法·leetcode
To_OC8 小时前
LC 131 分割回文串:刚学回溯时,我连怎么切字符串都想不明白
javascript·算法·leetcode
炸膛坦客9 小时前
单片机/C/C++八股:(二十六)IIC 专题(I²C)---- 上集
c语言·c++·单片机
旖-旎9 小时前
LeetCode 518:零钱兑换||(完全背包)—— 题解
c++·算法·leetcode·动态规划·背包问题
To_OC10 小时前
LC 42 接雨水:暴力超时卡半天?前后缀数组一用就通了
javascript·算法·leetcode
delishcomcn11 小时前
AI视觉识别+分切算法:电化铝缺陷检测与裁切一体化解锁
人工智能·算法
触底反弹11 小时前
深入理解大模型采样:Temperature、Top-K、Top-P 的原理与实战
人工智能·算法·面试
雪碧聊技术11 小时前
力扣 LCR 091. 粉刷房子 —— 动态规划入门详解
算法·动态规划