`

面试常问的算法

    博客分类:
  • Java
阅读更多
一、冒泡排序

Java代码
package sort.bubble;  
 
import java.util.Random;  
/** 
* 依次比较相邻的两个数,将小数放在前面,大数放在后面 
* 冒泡排序,具有稳定性 
* 时间复杂度为O(n^2) 
* 不及堆排序,快速排序O(nlogn,底数为2) 
* @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+" ");  
        }  
        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.bubble;

import java.util.Random;
/**
* 依次比较相邻的两个数,将小数放在前面,大数放在后面
* 冒泡排序,具有稳定性
* 时间复杂度为O(n^2)
* 不及堆排序,快速排序O(nlogn,底数为2)
* @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+" ");
}
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;
}
}
}
}
}


二、选择排序

Java代码
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.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;
}
}
}
}
}


三、快速排序

Java代码
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.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);
}
}
}


四、插入排序

Java代码
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;  
 
        }  
    }  


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;

}
}
}


五、顺便贴个二分搜索法

Java代码
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;  
          
    }  

分享到:
评论

相关推荐

    面试常考算法

    ### 面试常考算法:八大排序方法详解 #### 一、概述 在计算机科学领域,排序算法是基础且重要的组成部分之一。特别是在面试场景中,掌握常见的排序算法及其特性对于求职者来说至关重要。本文将详细介绍八种常用的...

    面试常问算法python实现.zip

    python面试题、知识点,用于程序员应聘学习参考,提供代码+题型等资料 python面试题、知识点,用于程序员应聘学习参考,提供代码+题型等资料 python面试题、知识点,用于程序员应聘学习参考,提供代码+题型等资料 ...

    java面试常遇到的算法

    在IT行业的Java编程领域,面试官常常通过一系列的算法题来评估应聘者的逻辑思维能力和编程技巧。以下是对给定文件中提及的几个经典算法题目的深入解析,旨在帮助准备Java面试的开发者们全面掌握相关知识点。 ### 1....

    面试中经常被问到的80道算法题

    算法面试题知识点总结 本资源摘要信息涵盖了八十道常见的算法面试题,涵盖了数据结构、算法设计、时间复杂度分析等多方面的知识点。 知识点一: 二元查找树转换为排序的双向链表 在这道题中,我们需要将一个二元...

    西交大 西安交通大学计算机软件复试面试常问问题.rar

    西交大 西安交通大学计算机软件复试面试常问问题西交大 西安交通大学计算机软件复试面试常问问题西交大 西安交通大学计算机软件复试面试常问问题西交大 西安交通大学计算机软件复试面试常问问题西交大 西安交通大学...

    软件大数据面试笔试复习资料面试技巧HR面试常问的问题总结面试笔试题整理资料合集.zip

    软件大数据面试笔试复习资料面试技巧HR面试常问的问题总结面试笔试题整理资料合集: 01大数据面试复习----Java基础---集合类、多线程、JVM 02大数据面试复习----画重点----常问问题分析 03大数据面试复习----画重点--...

    BAT面试常问80题.zip

    这些公司对于应聘者的面试通常涉及到广泛的IT技术知识,包括但不限于计算机基础、算法与数据结构、操作系统、网络、数据库、编程语言等。下面我们将围绕这些主题,详细阐述可能在BAT面试中遇到的知识点。 1. 计算机...

    JAVA程序员 面试 java面试资料集锦 经验 面试常问的问题 面试无忧

    这份"JAVA程序员面试 java面试资料集锦 经验 面试常问的问题 面试无忧"的资源旨在帮助你充分准备,提升面试成功的概率。 首先,Java面试通常会围绕以下几个核心领域展开: 1. **基础知识**:面试官会检查你对Java...

    C/C++面试常问问题

    在C/C++编程语言的世界里,面试通常会涵盖多个核心领域,包括语法、内存管理、数据结构、算法、STL(标准模板库)、多线程、异常处理、编译原理等。以下是一些可能在面试中被问到的常见问题及其详细解释: 1. **...

    程序员面试经典算法题

    "编程之美——微软技术面试心得"这本书是这个压缩包中的核心文件,它很可能包含了微软公司在面试中常问的算法题目和解题策略。微软作为全球顶级的科技公司,其面试标准往往代表了业界的高标准。书中可能涵盖的算法...

    java面试常问基础知识总结(超经典)

    Java作为一门广泛使用的编程语言,其面试基础知识涵盖了众多领域,包括但不限于语法、数据结构、算法、多线程、集合框架、异常处理、IO流、网络编程等。以下是对这些核心知识点的详细阐述: 1. **Java语法**:这是...

    java面试常问题目,java面试常问题目

    以下是一些常见的Java面试知识点,这些内容可能出现在“Java面试常问题目”中: 1. **Java基础**: - 数据类型:了解基本类型和引用类型的差异,以及自动装箱拆箱的概念。 - 变量与作用域:理解变量的声明、初始...

    大数据面试复习总结

    大数据面试复习---Java基础---集合类、多线程、JVM 大数据面试复习----常问问题分析 ...大数据面试复习----人事面试常问的问题总结 大数据面试复习----数据结构和算法+其他 大数据面试复习---项目架构流图串讲

    算法面试常考25题

    计算机面试时,考试官会经常问到的25道算法题,让你面试过程中百战百胜

    java面试题目 java面试最常问问题 java面试题集

    以下是一些Java面试中最常被问到的知识点,包括但不限于核心概念、数据结构与算法、多线程、集合框架、异常处理、IO流、网络编程以及设计模式等。 1. **核心概念**: - Java的特点:一次编写,到处运行(Write ...

    200道java程序员面试常问知识点

    根据给定的文件内容,无法提供具体的Java程序员面试常问知识点,因为所提供的“部分内容”是经过OCR扫描后未经修正的乱码文本。这些内容无法翻译成有意义的中文信息,也就无法从中提取出任何有关Java面试的知识点。 ...

    开发人员面试常问类型.pdf

    本文将从自我介绍、数据结构和算法、设计模式、Java 虚拟机等方面对开发人员面试常问类型进行讲解。 一、自我介绍 在面试中,自我介绍是一个非常重要的部分。通过自我介绍,面试官可以了解候选人的技术背景、实践...

    数据结构面试大全 面试 算法

    面试中可能会问到数组的特性、动态数组(如ArrayList)与静态数组的区别,以及数组的排序算法(如冒泡、选择、插入排序等)。 2. **链表**:链表允许在内存中非连续的位置存储元素,分为单链表、双链表和环形链表等...

    面试常问80题.zip

    这个"面试常问80题.zip"压缩包涵盖了多线程、高并发、集合框架、数据库和JVM等关键领域的面试题目,为应聘者提供了全面的学习和复习材料。下面将对这些关键领域进行深入讲解。 1. **多线程**:多线程是并发编程的...

    数据结构复试/夏令营面试常问问题

    数据结构复试/夏令营面试常问问题 ...本文涵盖了数据结构复试/夏令营面试常问问题的多个方面,包括时间复杂度、空间复杂度、数的逻辑结构和存储结构、循环和递归、贪心算法、动态规划和分治法等。

Global site tag (gtag.js) - Google Analytics