几个排序算法

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;
}
相关推荐
黑客思维者1 小时前
《我是如何用C语言写工控系统的漏洞和Bug》连载(1)内容大纲
c语言·bug·工控漏洞
j_xxx404_1 小时前
数据结构:栈和队列力扣算法题
c语言·数据结构·算法·leetcode·链表
南莺莺1 小时前
假设一个算术表达式中包含圆括号、方括号和花括号3种类型的括号,编写一个算法来判别,表达式中的括号是否配对,以字符“\0“作为算术表达式的结束符
c语言·数据结构·算法·
THMAIL2 小时前
深度学习从入门到精通 - 神经网络核心原理:从生物神经元到数学模型蜕变
人工智能·python·深度学习·神经网络·算法·机器学习·逻辑回归
野犬寒鸦2 小时前
力扣hot100:旋转图像(48)(详细图解以及核心思路剖析)
java·数据结构·后端·算法·leetcode
墨染点香2 小时前
LeetCode 刷题【61. 旋转链表】
算法·leetcode·职场和发展
一枝小雨2 小时前
【OJ】C++ vector类OJ题
数据结构·c++·算法·leetcode·oj题
Tisfy2 小时前
LeetCode 3516.找到最近的人:计算绝对值大小
数学·算法·leetcode·题解
自信的小螺丝钉2 小时前
Leetcode 206. 反转链表 迭代/递归
算法·leetcode·链表
buyutang_3 小时前
C/C++ Linux系统编程:线程控制详解,从线程创建到线程终止
linux·c语言·c++·学习