首页 > 其他分享 >day7

day7

时间:2024-09-19 19:24:55浏览次数:11  
标签:arr int day7 ++ 数组 排序 left

  1. 归并排序
    概述:
    归并排序是一种基于分治法的排序算法。它将数组分成两个子数组,递归地对这两个子数组进行排序,然后将两个已排序的子数组合并成一个有序的数组。
    步骤:
    将待排序的数组分成两半。
    递归地对这两个子数组进行排序。
    合并两个已排序的子数组以形成一个有序的数组。
    时间复杂度:
    最好情况:O(n log n)
    平均情况:O(n log n)
    最坏情况:O(n log n)
    空间复杂度: O(n)(需要额外的空间来存储合并过程中的数组)
    特点:
    稳定排序算法(不会改变相同元素的相对顺序)。
    适合处理大规模数据。
    需要额外的空间来存储中间结果。
    C++ 确实是一个非常强大的编程语言,在性能和控制方面具有很大的优势。它被广泛用于系统编程、游戏开发、实时系统等对性能有高要求的领域。下面是归并排序和快速排序的 C++ 实现代码示例:
    // 合并两个已排序的子数组
    void merge(std::vector& arr, int left, int mid, int right) {
    int n1 = mid - left + 1;
    int n2 = right - mid;
    std::vector L(n1);
    std::vector R(n2);
    // 将数据复制到临时数组 L[] 和 R[]
    for (int i = 0; i < n1; ++i)
    L[i] = arr[left + i];
    for (int j = 0; j < n2; ++j)
    R[j] = arr[mid + 1 + j];
    // 合并临时数组到原数组
    int i = 0;
    int j = 0;
    int k = left;
    while (i < n1 && j < n2) {
    if (L[i] <= R[j]) {
    arr[k++] = L[i++];
    } else {
    arr[k++] = R[j++];
    }
    }
    // 复制剩余的元素
    while (i < n1) {
    arr[k++] = L[i++];
    }
    while (j < n2) {
    arr[k++] = R[j++];
    }
    }
    // 递归排序
    void mergeSort(std::vector& arr, int left, int right) {
    if (left < right) {
    int mid = left + (right - left) / 2;
    mergeSort(arr, left, mid);
    mergeSort(arr, mid + 1, right);
    merge(arr, left, mid, right);
    }
    }

  2. 快速排序
    概述:
    快速排序是一种高效的排序算法,同样基于分治法。它通过选择一个“基准”元素,将数组划分为比基准元素小的部分和比基准元素大的部分,然后递归地对这两个部分进行排序。
    步骤:
    选择一个基准元素(通常是数组中的一个元素)。
    将数组分成两个部分:小于基准元素的部分和大于基准元素的部分。
    递归地对两个部分进行排序。
    合并已排序的部分(不需要额外的合并步骤,因为原地排序)。
    时间复杂度:
    最好情况:O(n log n)(当基准元素能均匀地划分数组时)
    平均情况:O(n log n)
    最坏情况:O(n²)(当基准元素选择不佳时,例如已排序数组)
    空间复杂度: O(log n)(递归栈空间)
    特点:
    非稳定排序算法(可能会改变相同元素的相对顺序)。
    大多数情况下非常高效,适合处理大规模数据。
    实现时需要选择合适的基准元素以避免最坏情况。
    例:
    // 分区函数,选择基准元素并将小于基准的元素放在左边,大于基准的元素放在右边
    int partition(std::vector& arr, int low, int high) {
    int pivot = arr[high];
    int i = (low - 1);

    for (int j = low; j <= high - 1; ++j) {
    if (arr[j] < pivot) {
    ++i;
    std::swap(arr[i], arr[j]);
    }
    }
    std::swap(arr[i + 1], arr[high]);
    return (i + 1);
    }
    // 递归快速排序函数
    void quickSort(std::vector& arr, int low, int high) {
    if (low < high) {
    int pi = partition(arr, low, high);
    quickSort(arr, low, pi - 1);
    quickSort(arr, pi + 1, high);
    }
    }

标签:arr,int,day7,++,数组,排序,left
From: https://www.cnblogs.com/wjhfree/p/18421199

相关文章

  • DAY7:scanf基础知识(中秋节快乐)
    *scanf读取用户的键盘输入。需要用到头文件<stdio.h>当程序运行到这句是会停留,等用户输入完成后继续运行下一条注意:scanf传递的不是值,而是地址,因此在使用时我们需要在变量前加上取地址符号“&”使用实例如下scanf有返回值,它是一个整数,表示成功读取变量的个数 如果没......
  • day7
    defself_max(x,y):ifx>y:returnx,1else:returny,2print(self_max(53453,32423))#####################defself_max(x,y,a,b,c,d=10):ifx>y:returnx,aelse:returny,dself_max(23,6,3,5,'f')########################可变长实参defself_max......
  • 自学JavaDay7
    面向对象类与对象类    现实世界中如果事物与事物有共同特征,那么我们就把他们称之为一类,比如鱼类,运动类,电竞类等等。类是人类大脑思考总结出的一个模板,是一个抽象的概念。一个事物都应该具备状态和行为,比如学生,状态包括性别,年龄等等行为包括学习,跑步等等   ......
  • 代码随想录算法day7 - 字符串1
    题目1344.反转字符串编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组s的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用O(1)的额外空间解决这一问题。示例1:输入:s=["h","e","l","l","o"]输出:["o","l","l","e",&qu......
  • mini-lsm通关笔记Week1Day7
    Summary在上一章中,您已经构建了一个具有get/scan/put支持的存储引擎。在本周末,我们将实现SST存储格式的一些简单但重要的优化。欢迎来到Mini-LSM的第1周零食时间!在本章中,您将:在SST上实现布隆过滤器,并集成到LSM读路径get中。以SST块格式实现对key存储的压缩。要将测试用例......
  • day7打卡
    反转字符串利用双指针不断向中间靠拢,交换数据classSolution{public:voidreverseString(vector&s){intleft=0;intright=s.size()-1;while(left<right){chartmp='\0';tmp=s[left];s[left++]=s[right];s[right--]=tmp;}}};反转字符串II......
  • 【读书笔记-《30天自制操作系统》-6】Day7
    本篇向着移动鼠标的目标继续前进。先对中断处理进行一些补充说明,然后建立完善缓冲区来实现键盘数据接收。最后是在此基础上的初始化鼠标控制电路与鼠标的数据接收。1.中断处理程序补充说明前面的处理中,接收到键盘中断后只是显示一行信息,现在把按键的信息也一并显示出来......
  • day7哈希表 454.四数相加II |383. 赎金信|15. 三数之和 |18. 四数之和
    454.四数相加IIclassSolution{publicintfourSumCount(int[]nums1,int[]nums2,int[]nums3,int[]nums4){//前两数相加,key是合,次数是value,跟后两数相加的和等于0的话,就取出map里的次数。//两个forloop时间复杂度n方。intres=0;......
  • Mybatis学习日记-day7-动态sql
    一、学习目标        在之前的学习中,使用的都是静态sql,而动态SQL相比静态SQL具有多个显著的优点。    首先。,动态SQL允许根据程序运行时的条件和需求来动态地生成SQL语句。这意味着它可以根据不同的情境和需求生成不同的SQL语句,从而提供更高的灵活性和适应......
  • 『dsu、Trie』Day7
    StampRallykruskal重构树板子,套上二分求一下祖先即可。AND-MEXWalk注意到答案只可能是0,1,2。因为1和2显然不能同时存在。证明:可知边权序列不增,如果前面出现2则说明第1位是0,由于是与运算所以不可能有1了。判断0和1即可。0好判断,只要全不为0,也就是最后......