分治思想
快速排序、归并排序、二分查找
快速排序
步骤一:设置两个指针,一头一尾
步骤二:设置处于数组中间位置的下标mid=(r+l)/2
步骤三:划分区域,左边小于a[mid],右边大于a[mid]
package aiguigu;
import java.util.*;
public class Demo{
public static void main(String[] args) {
int a[]=new int[1000];
int n;
Scanner in=new Scanner(System.in);
n=in.nextInt();
for(int i=0;i<n;i++){
a[i]=in.nextInt();
}
quick_sort(a,0,n-1);
for(int i=0;i<n;i++){
System.out.print(a[i]+" ");
}
}
public static void quick_sort(int a[],int r,int l){
if(r>=l) return;
int mid=r+l>>1;
int i=r-1,j=l+1;
while (i<j){
do i++;while (a[i]<a[mid]);
do j--;while (a[j]>a[mid]);
if(i<j) {
int m=a[i];
a[i]=a[j];
a[j]=m;
}
}
quick_sort(a,r,j);
quick_sort(a,j+1,l);
}
}
归并排序
步骤一:原数组a[m],取中间值mid=r+l>>1,创建一个空数组q[m]
步骤二:将整个数组一分为二,设置两个头指针分别指向两个数组的第一元素,两指针所指元素比较大小,较小的那个放进q数组中,指针继续移动,较大的停下来比较大小。
步骤三:将新数组q里面的元素再重新赋值给a数组
package aiguigu;
import java.util.*;
public class Demo{
public static int q[]=new int[1000];
public static void main(String[] args) {
int a[]=new int[1000];
Scanner input=new Scanner(System.in);
int n=input.nextInt();
for(int i=0;i<n;i++){
a[i]=input.nextInt();
}
merge_sort(a,0,n-1);
for(int i=0;i<n;i++){
System.out.print(q[i]+" ");
}
}
public static void merge_sort(int a[],int r,int l){
if(r>=l) return;
int mid=r+l>>1;
merge_sort(a,r,mid);
merge_sort(a,mid+1,l);
int k=0,i=r,j=mid+1;
while (i<=mid&&j<=l){
if(a[i]<=a[j])
q[k++]=a[i++];
else
q[k++]=a[j++];
}
while (i<=mid)
q[k++]=a[i++];
while (j<=l)
q[k++]=a[j++];
for(i=r,j=0;i<=l;i++,j++){
a[i]=q[j];
}
}
}
二分查找
分为整型查找和浮点型查找,整型查找要考虑边界问题二浮点型不用
整型查找
package aiguigu;
import java.util.*;
public class Demo{
public static int a[]=new int[10000];
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
int n=input.nextInt();
int q=input.nextInt();
for(int i=0;i<n;i++){
a[i]=input.nextInt();
}
while (q>0){
q--;
int r=0,l=n-1;
int k=input.nextInt();
while (r<l){
int mid=r+l>>1;
if(a[mid]>=k)
l=mid;
else
r=mid+1;
}
if(a[l]!=k)
System.out.println("-1 -1");
else{
System.out.print(l+" ");
r=0;
l=n-1;
while (r<l){
int mid=r+l+1>>1;
if(a[mid]<=k)
r=mid;
else
l=mid-1;
}
System.out.println(l);
}
}
}
}
浮点型查找
package aiguigu;
import java.util.*;
public class Demo{
public static int a[]=new int[10000];
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
double x=input.nextDouble();
double r=-10000.0,l=10000.0;
while (l-r>1e-8){
double mid=(r+l)/2;
if(mid*mid*mid>=x)
l=mid;
else
r=mid;
}
System.out.println(Math.round(r));
}
}