首页 > 其他分享 >14_学习日志_数据结构_冒泡排序_快速排序_插入排序

14_学习日志_数据结构_冒泡排序_快速排序_插入排序

时间:2024-03-14 17:33:19浏览次数:21  
标签:14 int 插入排序 元素 冒泡排序 high low 基准 tem

#include<编织有意义的谎言,使我相信闭上眼再睁开眼时的世界是同一个>
1.介绍

        从后往前或者从前往后开始两两比较元素,使得最小数上浮或者最大数下沉为冒泡排序,快速排序利用分治思想,使得基准数左边都存放相对较小数,右边存放较大数,两边再按照同样的做法重复。插入排序默认第一个数据为有序排列,剩余的数字依次与之比较形成新的有序序列,直至最后一个元素找到最终位置。

2.冒泡排序函数以及交换函数

        外层循环决定函数执行次数,内层循环从后往前遍历,两两比较,后一个数小于前一个数时交换两数位置,加入ret判断,若一趟下来没有发生任何交换,说明该序列原本就有序。

void swap(int &a, int &b) {
    int tmp;
    tmp = a;
    a = b;
    b = tmp;
}
void bubble_sort(Elem *n, int a) {
    int i, j;
    bool ret;
    for (i = 0; i < a - 1; i++) {
        ret = false;
        for (j = a - 1; j > i; j--) {
            if (n[j - 1] > n[j]) {
                swap(n[j - 1], n[j]);
                ret = true;
            }
        }
    }
    if (!ret) {
        return;
    }
}
3.快排递归函数与快排核心函数

        quick_sort用于递归,基准数将序列分割成两部分后,前一部分与后一部分继续执行操作,基准数不再参与。核心函数partition,默认第一个元素为基准,记录该基准数,进入循环,从后往前遍历,找到比基准数小的元素,赋值给low位置元素,此时high位置不动,low往前遍历,找到第一个比基准数大的元素,赋值给此时high的位置,经过一轮交换,low与high相遇,此时low位置就是基准数确定下来的最终位置。

int partition(Elem *s, int low, int high) {
    int pivot = s[low];
    while (low < high) {
        while (low < high && s[high] >= pivot)
            high--;
        s[low] = s[high];
        while (low < high && s[low] <= pivot)
            low++;
        s[high] = s[low];
    }
    s[low] = pivot;
    return low;
}

void quick_sort(Elem *s, int low, int high) {

    if (low < high) {
        int pivot_pos = partition(s, low, high);
        quick_sort(s, low, pivot_pos - 1);
        quick_sort(s, pivot_pos + 1, high);
    }
}
4.插入排序函数

        内层循环决定执行次数,记录第二个元素值,进入内层循环第二个元素与第一个元素比较,若第一个元素较大,将第一个元素的值赋给第二个元素,最后将记录下来的值放入第一个元素,循环往复直至遍历整个数组。

void insert_sort(Elem *s, int len) {
    int i, j, tem;
    for (i = 1; i < len; i++) {
        tem = s[i];
        for (j = i - 1; j >= 0 && s[j] > tem; j--) {
            s[j + 1] = s[j];
//            s[j]=tem;
        }
        s[j + 1] = tem;
    }
}
5.总结

        快速排序作为上述排序中综合表现最为优异的算法,代码量同样高于另外两种排序方式。

标签:14,int,插入排序,元素,冒泡排序,high,low,基准,tem
From: https://blog.csdn.net/weixin_67841893/article/details/136715924

相关文章

  • 文心一言 VS 讯飞星火 VS chatgpt (214)-- 算法导论16.2 1题
    一、证明:分数背包问题具有贪心选择性质。如果要写代码,请用go语言。文心一言:要证明分数背包问题具有贪心选择性质,我们可以按照以下步骤进行逻辑推导:理解问题:分数背包问题允许我们选择物品的部分重量,目标是最大化背包内物品的总价值,同时不超过背包的总容量。贪心策略:我......
  • 3.14 CF Round 933 (Div. 3)
    (1)CF1941BRudolfand121给定一个长度为\(n\)的序列\(a\)。求最少进行多少次操作后所有\(a_i=0\):选择一个\(2\lei<n\),并让\(a_i\getsa_i-2,a_{i-1}\getsa_{i-1}-1,a_{i+1}\getsa_{i+1}-1\)。我们记选择\(i=x\)时的操作为\(\opera......
  • 百度网盘(百度云)SVIP超级会员共享账号每日更新(2024.03.14)
    一、百度网盘SVIP超级会员共享账号可能很多人不懂这个共享账号是什么意思,小编在这里给大家做一下解答。我们多知道百度网盘很大的用处就是类似U盘,不同的人把文件上传到百度网盘,别人可以直接下载,避免了U盘的物理载体,直接在网上就实现文件传输。百度网盘SVIP会员可以让自己百度账......
  • KubeSphere 社区双周报|2024.02.29-03.14
    KubeSphere社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过commit的贡献者,并对近期重要的PR进行解析,同时还包含了线上/线下活动和布道推广等一系列社区动态。本次双周报涵盖时间为:2024.02.29-03.14。贡献者名单新晋KubeSpherecontribu......
  • dp 练习题 2024.3.14
    ARC070ENarrowRectangles题意:平面上有\(n\)个矩形,左下角点坐标为\((l_i,i-1)\),右上角点坐标为\((r_i,i)\)。每次把一个矩形沿着横轴方向移动一个长度单位,求移动多少次使得任意两个相邻矩形存在交点。\(1\len\le10^5,\space1\lel_i<r_i\le10^9\)考虑最简单的dp,设\(......
  • leetcode141.环形链表
    给你一个链表的头节点 head ,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从0开始)。注意:pos 不作为参数进行传递 。仅仅是为了标......
  • C语言冒泡排序
            冒泡排序是一种简单的排序算法,通过重复遍历要排序的数列,依次比较两个相邻的元素,如果它们的顺序错误则交换它们。这个过程会重复进行,直到没有相邻的元素需要交换,也就是数列已经排序完成。        冒泡排序的名字来源于其工作方式,因为较小的元素会像气......
  • 2024/3/11打卡管道(14届蓝桥杯省赛)——二分+区间合并
    目录题目思路代码题目有一根长度为 len的横向的管道,该管道按照单位长度分为 len 段,每一段的中央有一个可开关的阀门和一个检测水流的传感器。一开始管道是空的,位于 Li 的阀门会在  时刻打开,并不断让水流入管道。对于位于  的阀门,它流入的水在 时刻会使得......
  • 疯了‼️ 3校公布24复试线!数学单科线140!
    感觉这个世界要疯了?!!总分分数线420!数学单科线140!!在24英语数学难上热搜之后,又迎来了国家线普涨,复试线新高。国家线公布后,清华大学、北京大学、中山大学率先公布了24考研的学校基本复试线。清华应统分数线420,数学单科线140.这个世界疯了?!!数三的24卷虽然不像数一那么冷门......
  • [262144 P]
    262144P题目描述游戏一开始有\(n\)个正整数,\((2<=n<=262144)\),范围在\(1-40\)。在一步中,贝西可以选相邻的两个相同的数,然后合并成一个比原来的大一的数(例如两个7合并成一个8),目标是使得最大的数最大,请帮助Bessie来求最大值思路我们假设所有的数全是\(40\)那么最大可以合成出......