首页 > 其他分享 >快排/归并/二分

快排/归并/二分

时间:2023-07-24 19:12:19浏览次数:30  
标签:二分 sort 归并 return int mid 快排 while

  • 排序

    • 快速排序

      • 主要思想:分治
      • 排序方式:
        • 确定分界点:左边界:q[l], 中间值:q[(l+r)/2],右边界,或者随机
        • 调整区间:小于等于x的在x左半边,大于等于x的在x右半边(最难的部分)
          • 法一:
            • 开a[],b[]
            • 扫描一遍q[] ,q[i]>=x q[i]->a[]; q[i]<=x q[i]->b[];
            • a[]->q[] b[]->b[]
          • 法二(更优美):
            • 两个指针i,j,i指向左端,j指向右端
            • i,j同时往中间走
            • 如果q[i]<x,i++,如果q[i]>x,移动j
            • 如果q[j]>x,j--,如果q[j]<x,此时交换q[i]与q[j]
            • 交换完之后,i++,j--
        • 递归处理左右两段
      • 模板:平均时间复杂度nlog2(n)
        void quick_sort(int q[], int l, int r){
        	if(l >= r) return ;
        	int x = q[(l + r) / 2], i = l - 1, j = r + 1;
        	while(i < j){
        		//do ++ i; while(q[i] < x);
        		//do -- j; while(q[j] > x);
        		while(q[++i] < x);
        		while(q[--j] > x);
        		if(i < j) swap(q[i], q[j]);
        	} 
        	quick_sort(q, l, j);
        	quick_sort(q, j + 1, r);
        	//x取q[l] ,sort(q,l,j),sort(q,j+1,r);
        	//x取q[r] ,sort(q,l,i-1);sort(q,i,r);
        	//x取q[(r+l+1)/2],sort(q,l,i-1);sort(q,i,r);
        	//x取q[(r+l)/2],sort(q,l,j),sort(q,j+1,r);
        	//总之x取右边界,sort取左指针
        	//x取左边界,sort取右指针
        }
        
    • 归并排序

      • 主要思想:分治
      • 排序方式:
        • 确定分界点:mid = (l + r)/2
        • 递归排序左右两段
        • 合并左右两段: 双指针
      • 模板:时间复杂度nlog2(n)
        void merge_sort(int q[], int l ,int r){
        	if(l >= r) return ;
        	int mid = l + r >> 1;
        	merge_sort(l, mid);
        	merge_sort(mid + 1, r);
        	int k = 1, i = l, j = mid + 1;
        	while(i <= mid && j <= r)
        		if(q[i] <= q[j]) tmp[k ++] = q[i ++];
        		else tmp[k ++] = q[j ++];
        	while(i <= mid) tmp[k ++] = q[i ++];
        	while(j <= r) tmp[k ++] = q[j ++];
        	for(int i = l, j = 1; i <= r; ++ i, ++ j)
        		 q[i] = tmp[j];
        }
        
  • 二分查找

        - 可以找到满足区间与不满足区间的边界点
    
    • 整数二分

      • 模板:
        //找最小
        int binary(int l, int r){
        	while(l < r){
        		int mid = r + l >> 1;
        		if(check(mid)) r = mid;
        		else l = mid + 1;
        	}
        	return l;
        }
        //找最大
        int binary(int l , int r){
        	while(l < r){
        		int mid = r + l + 1 >> 1;
        		if(check(mid)) l = mid;
        		else r = mid - 1;
        	}
        	return l;
        }
        
    • 浮点数二分

      • 模板
        	//浮点数二分模板一:
        void binary(int x){
            double l = 0, r = 1000;
            while(r - l > 1e-9){
                double mid = (r + l) / 2;
                if(mid*mid*mid < x) l = mid;
                else r = mid; 
            }
            printf("%.6f",l);
            return ;
        }
        
        //浮点数二分模板二:
        void binary(int x){
            double l = 0, r = 1000;
            for(int i = 1; i < 100; i ++){
                double mid = (r + l) / 2;
                if(mid*mid*mid < x) l = mid;
                else r = mid; 
            }
            printf("%.6f",l);
            return ;
        }
        

标签:二分,sort,归并,return,int,mid,快排,while
From: https://www.cnblogs.com/moilip/p/17578085.html

相关文章

  • 二分
    二分二分查找作用:是用来在一个有序数组中查找某一元素的算法。过程:以在一个升序数组中查找一个数为例。它每次考察数组当前部分的中间元素,如果中间元素刚好是要找的,就结束搜索过程;如果中间元素小于所查找的值,那么左侧的只会更小,不会有所查找的元素,只需到右侧查找;如果中间元......
  • 二分答案
    二分答案:基本要点:二分答案就是将暴力找答案的过程变为二分找答案将最优化问题转变为可行性问题二分的答案要求有界性/单调性/二段性主要用于解决最大值最小化/最小值最大化问题check函数求y一般用贪心基础模板://最大化答案模板:boolcheck(intx){...//计算y......
  • 二分查找
    二分n个数找k是第几个(k有多个,输出第一个,如果不存在输出-1):如数列:$2$$7$$9$$1$$3$$5$$6$$2$$3$二分要保证:有序(若无序先排序),满足单调性数列单调不降Sort后:$1$$2$$2$$3$$3$$5$$6$$7$$9$#include<iostream>usingnamespacestd;intmain(){ inta[10]={0,1,......
  • 二分查找模板
    目录一、整数二分1.1整数二分查找模板1.1.1寻找右边界的二分查找1.1.2寻找左边界的二分查找二、浮点数二分2.1浮点数二分查找模板三、使用STL进行二分查找3.1std::binary_search3.2std::lower_bound3.3std::upper_bound3.4std::equal_range一、整数二分二分查找分为整数......
  • 二分图
    一.定义二分图是节点由两个集合组成,且两个集合内部没有边的图。换言之,存在一种方案,将节点划分成满足以上性质的两个集合。比如下图就是一个二分图,两个集合的元素可以用两种颜色表示,每条边上连接的点属于不同的集合,相同集合的两个点上没有边注意:二分图中不存在元素为奇数的环......
  • 2023夏季集训D1-贪心二分
    2023夏季集训D1贪心二分0x00前言24OIFXJ大佬来给我们讲课OrzOrz.讲课好难TAT.0x10贪心0x11经典贪心写了BestCowLineG/S和田忌赛马一位小伙从同学那里要来了一份BestCow代码Debug但没有发现代码没有输入,这是他思路3小时后发生的hack.田忌赛马太......
  • LeetCode 1201. Ugly Number III 数学+二分答案
    Anuglynumberisapositiveintegerthatisdivisibleby\(a\),\(b\),or\(c\).Givenfourintegers\(n\),\(a\),\(b\),and\(c\),returnthe\(n\)thuglynumber.Solution考虑如何二分答案,假设一个函数\(f(num,a,b,c)\)会得到\([1,num]\)中uglynumb......
  • LeetCode 875. Koko Eating Bananas 二分答案
    Kokolovestoeatbananas.Thereare\(n\)pilesofbananas,the\(i\)thpilehas\(piles[i]\)bananas.Theguardshavegoneandwillcomebackinhhours.Kokocandecideherbananas-per-houreatingspeedofk.Eachhour,shechoosessomepileofb......
  • LeetCode 1011. Capacity To Ship Packages Within D Days 二分答案
    Aconveyorbelthaspackagesthatmustbeshippedfromoneporttoanotherwithindaysdays.Theithpackageontheconveyorbelthasaweightof\(weights[i]\).Eachday,weloadtheshipwithpackagesontheconveyorbelt(intheordergivenby\(wei......
  • 二分专题训练
    KC喝咖啡题目描述:给\(n\)个物品,每个物品有两个属性\(v_i\)和\(c_i\),选出其中\(m\)件,最大化\(\frac{\sumv_i}{\sumc_i}\)。数据范围:\(1≤m≤n≤200\),\(1≤c_i,v_i≤1×10^4\)。01分数规划的板子题,不过很久没写过了还是记录一下。对于一个数值\(\lambda\),验证其是否符合条......