排序、查找

分治思想
快速排序、归并排序、二分查找

快速排序
步骤一:设置两个指针,一头一尾
步骤二:设置处于数组中间位置的下标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));
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值