面试必备排序算法java版(冒泡、快排、归并、堆排)

以下四个排序是面试时的高频考点,直接背住,快速手撕。

冒泡排序(注意使用flag提升效率)

public class bubble_sort {
    public void bubblesort(int[] nums){
        if(nums.length<=1) return;
        boolean flag=true;//标记位,如果已经有序,立即结束
        for(int i=0;i<nums.length-1;i++){
            for(int j=0;j<nums.length-1-i;j++){
                if(nums[j]>nums[j+1]){
                    int tmp=nums[j];
                    nums[j]=nums[j+1];
                    nums[j+1]=tmp;
                    flag=false;
                }
            }
            if(flag) break;
            else flag=true;
        }
    }
}

快排(必背)

public class quick_sort {
    public void quicksort(int[] nums){
        if(nums.length<=1) return;
        quicksort(nums,0,nums.length-1);
    }
    public void quicksort(int[] nums,int low,int high){
        if(low<high){
            int pivot = partition(nums, low, high);
            quicksort(nums,low,pivot-1);
            quicksort(nums,pivot+1,high);
        }
    }
    public int partition(int[] nums,int low,int high){
        if(low==high) return low;
        int i=low,j=high+1;
        int pivot=nums[low];//以pivot为中心,左边的都比pivot小,右边的都比pivot大
        while(true){
            while(nums[++i]<pivot){
                if(i>=high) break;
            }
            while(nums[--j]>pivot){
                if(j<=low) break;
            }
            if(i>=j) break;
            swap(nums,i,j);
        }
        swap(nums,low,j);
        return j;
    }
    public void swap(int[] nums,int i,int j){
        int tmp=nums[i];
        nums[i]=nums[j];
        nums[j]=tmp;
    }
}

归并(必背)

public class merge_sort {
    public void mergesort(int[] nums){
        if(nums.length<=1) return;
        int[] tmp=new int[nums.length];
        mergesort(nums,tmp,0,nums.length-1);
    }
    public void mergesort(int[] nums,int[] tmp,int low,int high){
        if(low<high){
            int mid=low+(high-low)/2;
            mergesort(nums,tmp,low,mid);
            mergesort(nums,tmp,mid+1,high);
            merge(nums,tmp,low,mid,high);
        }
    }
    public void merge(int[] nums,int[] tmp,int low,int mid,int high){
        int i=low,j=mid+1;
        int index=low;
        while(i<=mid&&j<=high) {
            if (nums[i] < nums[j]) tmp[index++] = nums[i++];
            else tmp[index++] = nums[j++];
        }
        while(i<=mid) tmp[index++]=nums[i++];
        while(j<=high) tmp[index++]=nums[j++];
        for(int k=low;k<=high;k++){
            nums[k]=tmp[k];
        }
    }
}

堆排序(主要是建堆)

//以大根堆为例
public class heap_sort {
    public void heapsort(int[] nums){
        int len=nums.length;
        build_heap(nums,len);
        for(int i=len-1;i>=0;i--){
            swap(nums,0,i);
            heapify(nums,0,i);
        }
    }
    public void build_heap(int[] nums,int len){
        for(int i=len/2-1;i>=0;i--){//从最后一个非叶子节点开始倒序建堆
            heapify(nums,i,len);
        }
    }
    public void heapify(int[] nums,int i,int len){
        int left=2*i+1,right=2*i+2;
        int index=i;//比较当前节点左右子节点确定调换位置
        if(left<len&&nums[left]>nums[index]) index=left;
        if(right<len&&nums[right]>nums[index]) index=right;
        if(index!=i){
            swap(nums,index,i);
            heapify(nums,index,len);
        }
    }
    public void swap(int[] nums,int i,int j){
        int tmp=nums[i];
        nums[i]=nums[j];
        nums[j]=tmp;
    }
}

主函数调用

public class Main {
    public static void main(String[] args) {
	  //以归并排序为例
        merge_sort sort=new merge_sort();
        int[] nums={0,1,2,3,4,-4,-6,-1};
        sort.mergesort(nums);
        for (int num : nums) {
            System.out.print(num+" ");
        }
    }
}

全部评论
mark
点赞 回复 分享
发布于 04-27 19:51 安徽
接好运
点赞 回复 分享
发布于 04-21 21:13 黑龙江

相关推荐

1.&nbsp;面评重要性:腾讯/字节&nbsp;&gt;&nbsp;想去的独角兽小厂&nbsp;&gt;&nbsp;其他大厂(度和手我认为是相对不怎么看的)2.&nbsp;还算有复活机会的公司(难易程度我觉得是据面评定的,所以不做偏差直觉分享,差距也不大):度、节、手、鹅(虽然我没复活过)3.&nbsp;鹅和节我是吃了很大面评的亏,几乎没怎么面过。节还稍微可以说下,首先节是****和官网都能投的,其次后面懂车帝面评好像拆了。4.&nbsp;内推挺关键的一些厂,就算被白吃&nbsp;+&nbsp;不帮你跟流程也建议找内推的,推荐认真研究怎么推和组内直推:pdd、腾讯5.&nbsp;看重测评的一些公司:讯飞、阿里、携程、京东、去哪儿(当然想去的大厂都建议认真做,除了携程别的我没见要春招重做的,只做一次还是能接受吧)6.&nbsp;要认真写在线简历的厂:应该只有美团?有的面试官会两个都看,但是有些面试官只看在线,不看附件。不过别的也得写得差不多。1.&nbsp;团:三个志愿,顺序流转。一志愿的好处是2.&nbsp;鹅:暑期开始内推和部门就锁了,春招部门才解开一次,谨慎填,谨慎找内推3.&nbsp;度、节:个人觉得官网摆设性比较强,约面都是****上的。可能是个人来说比较难在官网这种大池子中被挑出来。这两家还有一个特点,好像啥时候都有hc。除非你是特别强的,不然建议准备好再投。当然投得早也复活机会多,前提是维护好面评。不过度没那么看面评,至少实习一定是,我唯一大二面试没黑面评的就是度了,也是我面得最多的大厂。4.&nbsp;pdd、滴滴:挂一次这个批次就投不进了,前者内推会更关键一点,后者更重要的是准备好再投。5.&nbsp;b、书、mhy、dewu:hc超少,尽早投动态更新,想到什么写什么--我当时就没人跟我说这些啊,不过也不奢求有人跟我说了关键还是得主动去问,多交一些上一届的朋友就很有帮助我这种砂币社恐,信息闭塞也是自找的
点赞 评论 收藏
分享
04-21 21:03
已编辑
门头沟学院 Java
大厂暑期的门槛至少要本或硕有一个2,但光有学历无实习过面优先级会在有大厂实习经历下方参考资料:学院本2硕大厂日常暑期过面加offer拿到手软,无实习但有普9本或普9硕或c9华五本c9华五硕优先级低于学历达到硬指标且有大厂实习的,约面相对不困难但过面相对困难部分大厂开始卡9甚至c9参考资料:本2或硕2或本硕双2有约不到美团面情况,但有9不会出现约不到美团面情况,本硕双9约不到快手面,本c9能约到快手面部分大厂流程和系统混乱参考资料:阿里系,从未面试过官网显示面试不通过,晚上线下开宣讲会说大量招人第二天早上通知岗位关了,笔试面试一起发,没做笔试的可以面,做了但分数不够的面试取消了,以及研二面试者面试美团时面试官拿到的简历是本科投暑期的简历部分大厂kpi面参考资料:再次点名阿里系,面试官提第一个问后全程不提问让面试者自由发挥,面完秒挂,刁难面试者如问hashmap怎么再hash,具体到了高四位和低四位位运算,然后扩容的时候变成高五位和低五位位运算,然后这样会怎么样,面试时全程质疑面试者频繁打断面完秒挂尽早投递会更好,但根据情况斟酌参考资料:暑期越靠后投递hc越少,就有可能出现同等学历同等项目前面投的能约面后面投的约不到,但金3会有许多有大厂实习的拿下第一批offer,若无大厂实习可以暂避锋芒不太早也不太晚的投,这样横向对比时池子里的有大厂实习佬更少,第一批投递和约面的池子里泡的全是有大厂实习的92,而暑期有大厂实习的2&gt;无大厂实习的9都是从教学的几十个92所看到的情况总结的,且有教出大厂offer,绝非弄虚作假证明材料:美团offerhttps://www.nowcoder.com/feed/main/detail/cb30151682fd43698fbae6fdd4fd5d7d?toCommentId=21487323https://www.nowcoder.com/feed/main/detail/f3ee932b0c944f87af8bf0aae6ada423?sourceSSR=usershttps://www.nowcoder.com/discuss/743909636629151744?sourceSSR=search腾讯offerhttps://www.nowcoder.com/feed/main/detail/7c95659d0f624495a53965eff6f942a0?sourceSSR=users字节offer、拼多多三面、腾讯offerhttps://www.nowcoder.com/discuss/739769620604682240?toCommentId=21488304京东offerhttps://www.nowcoder.com/feed/main/detail/c200b3bb092848bd83d8f512aa5b9b17?sourceSSR=users最后说一句,大家都很优秀,没拿到offer只是因为现在的要求过于苛刻。龙就是龙,虽败犹荣
ResourceUtilization:点了佬像阿里京东太卡学历了,没有机会约面
点赞 评论 收藏
分享
评论
2
9
分享

创作者周榜

更多
牛客网
牛客企业服务