equals和快速排序递归方法

笔试失败的动力来源于什么!

每天我都在复习Java基础今天笔试一道天天见的题,我没做对,心理的惭愧不说,天天看的东西我居然没有写出来这事就equals方法的底层实现,我现在就equals方法进行一个简单的实现。

首先equals方法是做什么的,在我的理解,它是被用来对对象进行比较,判断是否两个对象的内容是否相等,并且返回Boolean值。

首先分析代码是如何实现的:

  1. 先对两个对象进行’==‘比较如果相同直接返回true,不同则继续使用以下方法进行比较;
  2. 对两个对象进行instanceof 看是否属于String,如果属于在比较其长度是否相同;
  3. 如果长度相同,在比较其每个位置对应的字符是不是相同,如果相同则返回true,否则这两个对象不同。

下面代码是我自己改写的equals方法,仅供参考:

public boolean equals(Object ojb1, Object ojb2){
    if (ojb1 == ojb2){
        return true;
    }
    if(ojb1 instanceof String && ojb2 instanceof String){
        String str1 = (String) ojb1;
        String str2 = (String) ojb2;
        int m = str1.length();
        int n = str2.length();
        if (m == n){
            char v1[] = str1.toCharArray();
            char v2[] = str2.toCharArray();
            int i = 0;
            while( n-- != 0 ){
                if (v1[i] != v2[i])
                    return false;
                i++;
            }
            return true;
        }
    }
    return false;
}

递归算法实现快速排序

吃亏还不长记性没办法活该吃亏,就在上次笔试中遇到了让写排序算法可以根据isDesc来判断是否从小到大或者从大到小在这个过程中让我吃了大亏,按道理说这块随便写个算法就可以了但是面试官不是这样理解的,面试官要求应该是一个比较有灵魂的排序算法,比如那些比较经典的快速排序,并不是我所写的冒泡排序让我惨遭被刷。随后本人便回家开始学习一种可以拿的出手的排序算法,快速排序。
例如下面这个数组:{2,4,5,9,7,6,3,1,8}首先需要从第一个数字开始遍历,第一个数字为2,以2为支撑数X,开始从右向左遍历数组遇到比2小的变换位置即可,i是从左往右的遍历节点,j是从右往左的遍历节点,第一轮遍历如下:
支撑节点X=2:
1) 1,4,5,9,7,6,3, 2 ,8 i=0,j=7;
2) 1, 2 ,5,9,7,6,3,4,8 i=1,j=7;
这个时候你就会发现2的左边都是比它小的数,右边都是比它大的数,这时候以2为中心左边开始从新按照上面的方法来执行一次,发现2左边只有1所以不管左边,现在观察2的右边都是比他大的而且数大于一个,这时候以i+1为开始的位置,j=8依然是最后一个数字。
支撑节点X=5:
1)1, 2 ,4,9,7,6,3, 5 ,8 i=2,j=7;
2)1, 2 ,4, 5 ,7,6,3,9,8 i=3,j=7;
3)1, 2 ,4,3,7,6, 5 ,9,8 i=3,j=6;
4)1, 2 ,4,3, 5 ,6,7,9,8 i=4,j=6;
这时候第二轮已经结束;
第三轮以5为中心,左边从i=2开始到j=3结束,右边从i=5开始j=8结束一直重复以上步骤即可完成排序。
Java代码如下所示:

public class QuickSoft {
    public void soft(Boolean isDesc, int a[], int start, int end){
        if (start < end ){
            int s = a[start];
            int i = start;
            int j = end;
            while( i < j ){

                while (i < j && (isDesc ? a[j]>=s : a[j]<=s))     //{2,4,5,9,7,6,3,1,8}
                    j--;
                if (i < j && i != j)
                    a[i++] = a[j];
                while(i < j && (isDesc ? a[i] < s : a[i] > s))
                    i++;
                if (i < j && i != j)
                    a[j--] = a[i];
            }
            a[i] = s;
            soft(isDesc, a, start, i-1);
            soft(isDesc, a, i+1, end);
        }
    }
    public static void main(String[] args) {
        QuickSoft q = new QuickSoft();
        int a[] ={2,4,5,9,7,6,3,1,8};
        Boolean isDesc = false;
        q.soft(isDesc, a, 0, a.length-1);
        for (int i=0; i<a.length; i++)
            System.out.print(a[i]);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值