几个排序算法

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;
}
相关推荐
万能程序员-传康Kk6 分钟前
旅游推荐数据分析可视化系统算法
算法·数据分析·旅游
PXM的算法星球12 分钟前
【并发编程基石】CAS无锁算法详解:原理、实现与应用场景
算法
ll77881112 分钟前
C++学习之路,从0到精通的征途:继承
开发语言·数据结构·c++·学习·算法
烨然若神人~14 分钟前
算法第十七天|654. 最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树
算法
爱coding的橙子26 分钟前
每日算法刷题Day2 5.10:leetcode数组1道题3种解法,用时40min
算法·leetcode
Akiiiira34 分钟前
【数据结构】栈
数据结构
程序媛小盐1 小时前
贪心算法:最小生成树
算法·贪心算法·图论
Panesle1 小时前
分布式异步强化学习框架训练32B大模型:INTELLECT-2
人工智能·分布式·深度学习·算法·大模型
c6lala1 小时前
数据结构day1
数据结构
多多*2 小时前
算法竞赛相关 Java 二分模版
java·开发语言·数据结构·数据库·sql·算法·oracle