[转载]java面试中经常会被问到的一些算法的问题

Java面试中经常会被问到的一些算法的问题,而大部分算法的理论及思想,我们曾经都能倒背如流,并且也能用开发语言来实现过,

可是很多由于可能在项目开发中应用的比较少,久而久之就很容易被忘记了,在此我分享一下在面试中经常被问到的一些基本的算法,也当做一次知识的巩固。

排序算法的一些特点:

* 排序算法的分类如下:* 1.插入排序(直接插入排序、折半插入排序、希尔排序);* 2.交换排序(冒泡泡排序、快速排序);* 3.选择排序(直接选择排序、堆排序);* 4.归并排序;* 5.基数排序。* * 关于排序方法的选择:* (1)若n较小(如n≤50),可采用直接插入或直接选择排序。*  当记录规模较小时,直接插入排序较好;否则因为直接选择移动的记录数少于直接插人,应选直接选择排序为宜。* (2)若文件初始状态基本有序(指正序),则应选用直接插人、冒泡或随机的快速排序为宜;* (3)若n较大,则应采用时间复杂度为O(nlgn)的排序方法:快速排序、堆排序或归并排序。

一:冒泡排序

  冒泡排序的核心是双循环,冒泡排序优点:比较简单,空间复杂度较低,是稳定的,缺点:时间复杂度高 O2;

package com.LZT.sortBubble;
import java.util.Random;
public class SortBubble{

/**
 * 依次比较相邻的两个数,将小数放在前面,大数放在后面
 * 冒泡排序,具有稳定性
 * 时间复杂度为O(n^2)
 * 不及堆排序,快速排序O(nlogn,底数为2)
 * @author liangge
 *
 */  

    public static void main(String[] args) {
        Random ran = new Random();
        int[] sort = new int[10];
        for(int i = 0 ; i < 10 ; i++){
            sort[i] = ran.nextInt(50);
        }
        System.out.print(“排序前的数组为”);
        for(int i : sort){
            System.out.print(i+” “);
        }
        buddleSort(sort);
        System.out.println();
        System.out.print(“排序后的数组为”);
        for(int i : sort){
            System.out.print(i+” “);
        }
    }   

    /**
     * 冒泡排序
     * @param sort
     */
    private static void buddleSort(int[] sort){
        for(int i=1;i<sort.length;i++){
            for(int j=0;j<sort.length-i;j++){
                if(sort[j]>sort[j+1]){
                    int temp = sort[j+1];
                    sort[j+1] = sort[j];
                    sort[j] = temp;
                }
            }
        }
    }
} 

二:选择排序

package sort.select;   

import java.util.Random;   

/**
 * 选择排序
 * 每一趟从待排序的数据元素中选出最小(或最大)的一个元素,
 * 顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。
 * 选择排序是不稳定的排序方法。
 * @author liangge
 *
 */
public class Main {
    public static void main(String[] args) {
        Random ran = new Random();
        int[] sort = new int[10];
        for (int i = 0; i < 10; i++) {
            sort[i] = ran.nextInt(50);
        }
        System.out.print(“排序前的数组为”);
        for (int i : sort) {
            System.out.print(i + ” “);
        }
        selectSort(sort);
        System.out.println();
        System.out.print(“排序后的数组为”);
        for (int i : sort) {
            System.out.print(i + ” “);
        }
    }   

    /**
     * 选择排序
     * @param sort
     */
    private static void selectSort(int[] sort){
        for(int i =0;i<sort.length-1;i++){
            for(int j = i+1;j<sort.length;j++){
                if(sort[j]<sort[i]){
                    int temp = sort[j];
                    sort[j] = sort[i];
                    sort[i] = temp;
                }
            }
        }
    }
}  

三: 快速排序

package sort.quick;   

/**
 * 快速排序 通过一趟排序将要排序的数据分割成独立的两部分, 其中一部分的所有数据都比另外一部分的所有数据都要小,
 * 然后再按此方法对这两部分数据分别进行快速排序, 整个排序过程可以递归进行,以此达到整个数据变成有序序列。
 * @author liangge
 *
 */
public class Main {
    public static void main(String[] args) {
        int[] sort = { 54, 31, 89, 33, 66, 12, 68, 20 };
        System.out.print(“排序前的数组为:”);
        for (int data : sort) {
            System.out.print(data + ” “);
        }
        System.out.println();
        quickSort(sort, 0, sort.length – 1);
        System.out.print(“排序后的数组为:”);
        for (int data : sort) {
            System.out.print(data + ” “);
        }
    }   

    /**
     * 快速排序
     * @param sort 要排序的数组
     * @param start 排序的开始座标
     * @param end 排序的结束座标
     */
    public static void quickSort(int[] sort, int start, int end) {
        // 设置关键数据key为要排序数组的第一个元素,
        // 即第一趟排序后,key右边的数全部比key大,key左边的数全部比key小
        int key = sort[start];
        // 设置数组左边的索引,往右移动判断比key大的数
        int i = start;
        // 设置数组右边的索引,往左移动判断比key小的数
        int j = end;
        // 如果左边索引比右边索引小,则还有数据没有排序
        while (i < j) {
            while (sort[j] > key && j > start) {
                j–;
            }
            while (sort[i] < key && i < end) {
                i++;
            }
            if (i < j) {
                int temp = sort[i];
                sort[i] = sort[j];
                sort[j] = temp;
            }
        }
        // 如果左边索引比右边索引要大,说明第一次排序完成,将sort[j]与key对换,
        // 即保持了key左边的数比key小,key右边的数比key大
        if (i > j) {
            int temp = sort[j];
            sort[j] = sort[start];
            sort[start] = temp;
        }
        //递归调用
        if (j > start && j < end) {
            quickSort(sort, start, j – 1);
            quickSort(sort, j + 1, end);
        }
    }
}  

四 :插入排序

package sort.insert;   

/**
 * 直接插入排序
 * 将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据
 * 算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。
 */
import java.util.Random;   

public class DirectMain {
    public static void main(String[] args) {
        Random ran = new Random();
        int[] sort = new int[10];
        for (int i = 0; i < 10; i++) {
            sort[i] = ran.nextInt(50);
        }
        System.out.print(“排序前的数组为”);
        for (int i : sort) {
            System.out.print(i + ” “);
        }
        directInsertSort(sort);
        System.out.println();
        System.out.print(“排序后的数组为”);
        for (int i : sort) {
            System.out.print(i + ” “);
        }
    }   

    /**
     * 直接插入排序
     *
     * @param sort
     */
    private static void directInsertSort(int[] sort) {
        for (int i = 1; i < sort.length; i++) {
            int index = i – 1;
            int temp = sort[i];
            while (index >= 0 && sort[index] > temp) {
                sort[index + 1] = sort[index];
                index–-;
            }
            sort[index + 1] = temp;   

        }
    }
}  

//另外 的一种写法
      static void insertion_sort(int[] unsorted)
        {
            for (int i = 1; i < unsorted.Length; i++)
            {
                if (unsorted[i - 1] > unsorted[i])
                {
                    int temp = unsorted[i];
                    int j = i;
                    while (j > 0 && unsorted[j - 1] > temp)
                    {
                        unsorted[j] = unsorted[j - 1];
                        j--;
                    }
                    unsorted[j] = temp;
                }
            }
        }

 

五:二分排序

package search.binary;   

public class Main {
    public static void main(String[] args) {
        int[] sort = {1,2,3,4,5,6,7,8,9,10};
        int mask = binarySearch(sort,6);
        System.out.println(mask);   

    }   

    /**
     * 二分搜索法,返回座标,不存在返回-1
     * @param sort
     * @return
     */
    private static int binarySearch(int[] sort,int data){
        if(data<sort[0] || data>sort[sort.length-1]){
            return -1;
        }
        int begin = 0;
        int end = sort.length;
        int mid = (begin+end)/2;
        while(begin <= end){
            mid = (begin+end)/2;
            if(data > sort[mid]){
                begin = mid + 1;
            }else if(data < sort[mid]){
                end = mid – 1;
            }else{
                return mid;
            }
        }
        return -1;   

    }
} 
时间: 2024-12-11 10:08:48

[转载]java面试中经常会被问到的一些算法的问题的相关文章

如何在Java面试中谈工资

在面试中,工资这块是不得不谈的,即使HR没有主动提起工资的问题,你也得主动顺其自然的跟HR谈起工资.为什么是顺其自然呢?因为在面试中谈工资也是项技术活,比如谈的太早,那么你们接下的的面试沟通环节就会崩塌.在Java面试中也是一样,今天就跟长沙尚学堂小编一起来看看,如何在Java面试中谈工资? 如何在Java面试中谈工资? 1. 有的朋友属于很急的性子,觉得自己在Java面试中,最关注的问题就是工资,总喜欢在Java面试中直接开门见山的问HR:我一个月能够拿到多少工资呢?如果HR也是你一样的性子,

Java面试中常问的Spring方面问题

Spring Framework 现在几乎已成为 Java Web 开发的标配框架.那么,作为 Java 程序员,你对 Spring 的主要技术点又掌握了多少呢?不妨用本文的问题来检测一下. 1.一般问题 1.1. 不同版本的 Spring Framework 有哪些主要功能? Version FeatureSpring 2.5 发布于 2007 年.这是第一个支持注解的版本.Spring 3.0 发布于 2009 年.它完全利用了 Java5 中的改进,并为 JEE6 提供了支持.Spring

JAVA面试中问及HIBERNATE与 MYBATIS的对比,在这里做一下总结(转)

hibernate以及mybatis都有过学习,在java面试中也被提及问道过,在项目实践中也应用过,现在对hibernate和mybatis做一下对比,便于大家更好的理解和学习,使自己在做项目中更加得心应手. 第一方面:开发速度的对比 就开发速度而言,Hibernate的真正掌握要比Mybatis来得难些.Mybatis框架相对简单很容易上手,但也相对简陋些.个人觉得要用好Mybatis还是首先要先理解好Hibernate. 比起两者的开发速度,不仅仅要考虑到两者的特性及性能,更要根据项目需求

巨人大哥谈Java面试中常考的信息安全方面知识(MD5)

巨人大哥谈Java面试中常考的信息安全方面知识(MD5) Java MD5 加密算法介绍以及使用 MD5 算法的介绍 特点 1.压缩性:任意长度的数据,算出的MD5值长度都是固定的. 2.容易计算:从原数据计算出MD5值很容易. 3.抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别. 4.强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的. 用途 1.可以用于加密用户密码 2.可以用于应用安装包的一致性验证 MD5 的简单

JAVA面试中需要准备的点

本人最近几年一直在做java后端方面的技术面试官,而在最近两周,又密集了面试了一些java初级和高级开发的候选人,在面试过程中,我自认为比较慎重,遇到问题回答不好的候选人,我总会再三从不同方面提问,只有当反复确认能力不行才会下结论,相反,如果候选人给我的印象不错,我也会从多个角度来衡量,以免招进会说但不会干活的“大忽悠”. 其实倒也不是我故意要为难候选人,毕竟入职后就是同事,但面试官的职责使然,而且,如果资深的面试官一般也这样. 写到这里,恐怕会吓到一些想要面试的朋友,能力强和能力弱都会被多问,

Java面试中常问的Spring方面问题(55道含答案)

Spring Framework 现在几乎已成为 Java Web 开发的标配框架.那么,作为 Java 程序员,你对 Spring 的主要技术点又掌握了多少呢?不妨用本文的问题来检测一下. 1.一般问题 1.1. 不同版本的 Spring Framework 有哪些主要功能? VersionFeatureSpring 2.5发布于 2007 年.这是第一个支持注解的版本.Spring 3.0发布于 2009 年.它完全利用了 Java5 中的改进,并为 JEE6 提供了支持.Spring 4.

Java面试中常问的计算机网络方面问题

GET 和 POST 的区别 (GET)请注意,查询字符串(名称/值对)是在 GET 请求的 URL 中发送的:/test/demo_form.asp?name1=value1&name2=value2 GET 请求可被缓存 GET 请求保留在浏览器历史记录中 GET 请求可被收藏为书签 GET 请求不应在处理敏感数据时使用 GET 请求有长度限制 GET 请求只应当用于取回数据POST 方法(POST)请注意,查询字符串(名称/值对)是在 POST 请求的 HTTP 消息主体中发送的:POST

JAVA面试中的陷阱

第一,谈谈final, finally, finalize的区别.最常被问到. 第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? 第三,Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统). 第四,&和&&的区别.这个问得很少. 第五,HashMap和Hashtable的区别.常问. 第六,Collection

java面试中常用的排序算法

一.冒泡排序 [java] view plaincopyprint? package sort.bubble; import java.util.Random; /** * 依次比较相邻的两个数,将小数放在前面,大数放在后面 * 冒泡排序,具有稳定性 * 时间复杂度为O(n^2) * 不及堆排序,快速排序O(nlogn,底数为2) * @author liangge * */ public class Main { public static void main(String[] args) {