算法导论第二章:算法基础-全部代码实现

public class Main {
    public static void main(String[] args) {
        Main example=new Main();

        //插入排序,用例为练习2.1-1,最坏情况运行时间:theta n平方.
        example.INSERTION_SORT(new int[]{31, 41, 59, 26, 41, 58});

        //练习2.1-3
        example.CHECK_QUESTION(new int[]{31, 41, 59, 26, 41, 58},22);

        //练习2.1-4
        example.BINARY_SUM(new int[]{1, 1, 0, 0, 1, 1}, new int[]{1, 1, 1, 0, 0, 0});

        //练习2.2-2选择排序
        example.CHOSE_SORT(new int[]{31, 41, 59, 31, 41, 58});

        //2.2-4:对输入进行控制,使之偏向能够使得算法具有最佳运行情况的排列

        //2.3.1归并排序,例子为2.3-1
        int[]A=new int[]{3,41,52,26,38,57,9,49};
        example.MERGE_SORT(A,0,6);
        for (int i : A) {System.out.print(i+" ");}System.out.println();

        //2.3-5二分查找
        example.CHECK_BINARY(A,9,0,A.length);

        //思考题2-4
        example.RESERVE_PAIR(new int[]{2,3,8,6,1});
        example.MERGE_SORT(new int[]{2, 3, 8, 6, 1}, 0, 5);
    }


    public void INSERTION_SORT(int[] A){
        //从第二个数开始遍历
        for (int j=1;j<A.length;j++){
            int key = A[j];
            int i=j-1;
            //找到key的正确位置
            while (i>=0&&key>A[i]){//降序
//          while (i>=0&&key<A[i]){//升序
                A[i+1]=A[i];//向后移
                i--;
            }
            A[i+1]=key;//插入
        }
        //打印结果
        for (int i : A) {
            System.out.print(i+" ");
        }
        System.out.println();
    }


    public void CHECK_QUESTION(int []A,int v){
        int i=0;
        while (i!=A.length){
            if (A[i]==v){
                System.out.println("Find it!");
                return;
            }
            i++;
        }
        System.out.println("NIL");
    }


    public void BINARY_SUM(int[]A,int[]B){
        int curr=0;
        int []C=new int[A.length+1];
        for (int i=A.length-1;i>=0;i--){
            if (A[i]+B[i]+curr==3){
                curr=1;
                C[i+1]=1;
            } else if (A[i]+B[i]+curr==2){
                curr=1;
                C[i+1]=0;
            }else if (A[i]+B[i]+curr==1){
                curr=0;
                C[i+1]=1;
            }else if (A[i]+B[i]+curr==0){
                curr=0;
                C[i+1]=0;
            }
        }
        C[0]=curr;
        for (int i :
                C) {
            System.out.print(i+" ");
        }
        System.out.println();
    }



    public void CHOSE_SORT(int []A){
        for (int i=0;i<A.length-1;i++){
            //记录最小元素的值和下标
            int min=A[i];
            int curr=i;
            for (int j=i+1;j<A.length;j++){
                if (A[j]<min){
                    min=A[j];
                    curr=j;
                }
            }
            //交换值
            A[curr]=A[i];
            A[i]=min;
        }
        for (int i : A) {
            System.out.print(i+" ");
        }
        System.out.println();
    }

    public void MERGE_SORT(int[] A,int p,int r) {
        //这里划分和原书不一样,个人认为这样划分比较合理,左闭右开
        if (r-p>1) {
            //划分(注意:左闭右开指的是划分,而不是合并)
            int q = p+(r-p) / 2;
            //递归
            MERGE_SORT(A, p, q);
            MERGE_SORT(A, q, r);
            //合并
//            MERGE_GUARD(A, p, q, r);//有哨兵的合并
//            MERGE_NO_GUARD(A,p,q,r);//无哨兵的合并
//            return MERGE_GUARD2(A,p,q,r);//查看逆序对数量
        }
    }
    public void MERGE_NO_GUARD(int[] A, int p, int q, int r) {
        int i=0;int l=p;int mid=q;
        int []T = new int[r - p];
        //在T中重排
        while (p<mid||q<r){
            if (q>=r||(p<mid&&A[p]<=A[q]))T[i++]=A[p++];
            else T[i++]=A[q++];
        }
        //返回原数组
        for (i=0;i<r-l;i++)A[i+l]=T[i];
    }
    
    public void MERGE_GUARD1(int[] A,int p,int q,int r){
        int n1=q-p;//左半边
        int n2=r-q;//右半边
        int[] L = new int[n1 + 1];
        int[] R = new int[n2 + 1];
        for (int i = 0; i < n1 ; i++) {
            L[i] = A[p + i];
        }
        for (int j = 0; j < n2 ; j++) {
            R[j] = A[q + j];
        }
        L[n1]=Integer.MAX_VALUE;//哨兵,少了剩余元素的判断
        R[n2]=Integer.MAX_VALUE;
        int i=0;
        int j=0;
        int inversions=0;//查看逆序对数量
        for (int k=p;k<r;k++){
            if (R[i]<L[j]){
                A[k] = R[i];
                inversions++;
                i++;
            }else {
                A[k]=L[j];
                j++;
            }
        }
    }
    public int MERGE_GUARD2(int[] A,int p,int q,int r){
        int n1=q-p;//左半边
        int n2=r-q;//右半边
        int[] L = new int[n1 + 1];
        int[] R = new int[n2 + 1];
        for (int i = 0; i < n1 ; i++) {
            L[i] = A[p + i];
        }
        for (int j = 0; j < n2 ; j++) {
            R[j] = A[q + j];
        }
        L[n1]=Integer.MAX_VALUE;//哨兵,少了剩余元素的判断
        R[n2]=Integer.MAX_VALUE;
        int i=0;
        int j=0;
        int inversions=0;//查看逆序对数量
        for (int k=p;k<r;k++){
            if (R[i]<L[j]){
                A[k] = R[i];
                inversions++;
                i++;
            }else {
                A[k]=L[j];
                j++;
            }
        }
        return inversions;
    }

    public void CHECK_BINARY(int []A,int v,int l,int r){
//        if (r-l>1){//递归实现
//            int mid=l+(r-l)/2;
//            if (A[mid]>v)CHECK_BINARY(A,v,l,mid);
//            else if (A[mid]<v)CHECK_BINARY(A,v,mid,r);
//            else if (A[mid]==v) System.out.println("FIND IT!");
//        }
        int mid=0;
        while (l<r){
            mid=l+(r-l)/2;
            if (A[mid]==v) {
                System.out.println("FIND IT!");
                return;
            }
            else if (A[mid]<v) l=mid;
            else l=mid+1;//左闭右开
        }
    }

    public void RESERVE_PAIR(int[] A){
        for (int i=1;i<A.length;i++){
            for (int j=i-1;j>=0;j--)
                if (A[i]<A[j]) System.out.print("("+A[j]+","+A[i]+")"+" ");
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值