左程云算法 DAY2

本文详细介绍了三种经典算法:使用位运算优化的二分查找法避免溢出,递归实现的归并排序以及荷兰国旗问题的解决方案。这些算法在实际编程中有着广泛应用,对于提升数据处理效率至关重要。同时,文章还展示了快速排序的升级版,结合荷兰国旗问题提高排序性能,并提及了随机选择划分元素的策略以增强排序稳定性。
摘要由CSDN通过智能技术生成

1、计算中点时为了防止相加溢出

mid = L+((R—L)>>1)

2、使用二分法思想,递归实现查找数组的最大最小值

//以查找最大值为例
public class Code08
public class GetMax{
	public int getmax(int[] arr){
		return process(0,arr.length-1,arr);
	}

	public static int process(int L,int R,int[] arr){
                 if(L==R){
                    return arr[L];}//此处为递归退出条件
		int mid = L+((R-L)>>1);
		int LeftMax = process(L,mid,arr);
		int RightMax = process(mid+1,R,arr);
		return Math.max(LeftMax,RightMax);
	}
}

3、归并排序

归并排序:将小部分的有序部分合并为大的有序序列

①采用递归思想,先局部排序process再两两归并merge

public class GetMax{
	public int getmax(int[] arr){
		return process(0,arr.length-1,arr);
	}

	public static int process(int L,int R,int[] arr){
		int mid = L+((R-L)>>1);
		process(L,mid,arr);
		process(mid+1,R,arr);
		merge(L,R,mid,arr);
	}
	public static int merge(int L,int R,int mid,int[] arr){
		int[] help = new int [R-L+1];
		int x = L;
		int y= mid+1;
		int p=0;
		if(L==R) return;
		while(x<=mid&&y<=R){
			arr[x]>arr[y]?help[p++]=arr[y++]:help[p++]=arr[x++];
		}
		while(x<=mid){
			help[p++]=arr[x++];
		}
		while(y<=mid){
			help[p++]=arr[y++];
		}
	}
	for(i=0,i<=R-L,i++){
		arr[l++]=help[i]
	}
}

题目三:荷兰国旗

1、给有一个数组arr和一个num,让数组中小于等于num的数在数组的左侧,大于num 的数在数组的右侧。

2、给一个数组arr和一个num,排序将小于num的数组排在数组的左侧,等于num的数排在数组的中间,大于num的数排在数组的右边

思想:[i]<num.,[i]与小于区下一个换,i原地不变,小于区扩大,

[i]=num,i++;

[i]>num,[i]与大于区下一个换,大于区扩大,i原地不变

public class TriColorFlag{
	public static void tricolorflag (int[] arr,int num){
		if(arr.length<2){
			return;
		}
		int ls = 0;
		int rs = arr.length-1;
		int i=0;
while(i<rs){
		if(arr[i]<num){
			swap(arr,i,ls);
			ls++;
			i++;
		}
		else if(arr[i]==num){
			i++;
		}
		else{
			swap(arr,i,rs);
			rs--;
		}
	}
}
	public static void swap(int[] arr,int L,int R){
		arr[L]=arr[L]^&arr[R];
		arr[R]=arr[L]^&arr[R];
		arr[L]=arr[L]^&arr[R];
	}
}

快排

快排1.0,每次找到一个数的最最终位置(一般都是选用数组最后一个数),然后左右侧不断递归

快排2.0:利用荷兰国旗问题替代1.0中的比较算法,这样就可以一次解决一批数字(等于划分值

快排3.0:随机选择一个数作为划分数


import java.util.*;
import java.lang.*;
import java.io.*;

/* Name of the class has to be "Main" only if the class is public. */
public class QuicSort{
	public void quicksort(int[] arr,int L,int R){
		swap(arr,L+(int)(Math.random()*(R-L+1),R);
		int[] p=partition(arr,L,R);
		quicksort(arr,L,p[0]-1);
		quicksort(arr,p[1]+1,R);
	}
//partition()是一个处理arr[L....R]的函数
//默认以arr[R]作划分,解决荷兰国旗问题
//返回等于区域,即荷兰国旗中间的两端组成的数组

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值