几个排序算法

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;
}
相关推荐
2601_970703834 分钟前
工业除湿机租赁:把一份租金合同拆开看
大数据·数据结构·算法·数据库架构·推荐算法
心中有你02144 分钟前
Java实现Dijkstra最短路径算法(邻接表 + 优先队列)
java·数据库·算法
ZhengEnCi1 小时前
同样的模型,为什么本地和云 API 差别那么大:量化精度、聊天模板与采样参数的三大元凶
人工智能·算法·llm
Zwawa1 小时前
串口为什么会丢字节:从轮询到中断和环形缓冲区
c语言·单片机·嵌入式
Flynn Liang1 小时前
RAG 答非所问/幻觉怎么破?Spring AI QuestionAnswerAdvisor 召回优化实战(TopK/重排/混合检索)
人工智能·算法·spring·rag·幻觉·springai
liminla!2 小时前
SQL 从入门到进阶:语法速查与实战练习(完整优化版)
数据库·sql·算法
维克兜率天3 小时前
【维克】指数调整:哪些股票会被“强制买入“?
人工智能·python·算法
罗西的思考3 小时前
【轻量化复刻大模型】线性注意力交互式演示
人工智能·算法·机器学习
神也畏惧菠萝4 小时前
Day08 Python流程控制从入门到上瘾:if/match/while/for四件套,从B站登录一路打到猜数字游戏
python·算法·数据存储·for·while·if·ifelse