面试笔试必用-必须掌握的Java排序算法

合集下载

java 经典笔试算法题

java 经典笔试算法题

java 经典笔试算法题一、排序算法1. 实现一个基于Java的快速排序算法。

答:快速排序是一种常用的排序算法,其核心思想是分治法。

首先选择一个基准元素,将数组分成两部分,一部分小于基准元素,一部分大于基准元素。

然后递归地对这两部分继续进行快速排序,直到整个数组有序。

2. 实现一个稳定的冒泡排序算法。

答:冒泡排序是一种简单的排序算法,通过重复地遍历待排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。

稳定的冒泡排序算法是指在排序过程中,相同元素的相对位置不会改变。

3. 实现一个选择排序算法。

答:选择排序是一种简单直观的排序算法。

其工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。

二、字符串操作算法1. 实现一个函数,将一个字符串反转。

答:可以使用StringBuilder类的reverse()方法来实现字符串的反转。

2. 实现一个函数,将一个字符串中的所有大写字母转换为小写字母,其余字符保持不变。

答:可以使用String类的replaceAll()方法和toLowerCase()方法来实现。

3. 实现一个函数,将一个字符串按空格分割成单词数组,并删除空字符串和null字符串。

答:可以使用split()方法和Java 8的流来处理。

三、数据结构算法1. 实现一个单向链表,并实现插入、删除、查找和打印链表的功能。

答:单向链表是一种常见的数据结构,可以通过定义节点类和链表类来实现。

插入、删除、查找和打印链表的功能可以通过相应的方法来实现。

2. 实现一个二叉搜索树(BST),并实现插入、查找、删除节点的功能。

答:二叉搜索树是一种常见的数据结构,它具有唯一的高度特性。

插入、查找和删除节点的功能可以通过相应的方法来实现,如左旋、右旋、递归等。

3. 实现一个哈希表(HashMap),并实现插入、查找和删除键值对的功能。

答:HashMap是一种基于哈希表的映射数据结构,它通过哈希码的方式将键映射到对应的值上。

Java面试题合集Java中的排序算法

Java面试题合集Java中的排序算法

Java面试题合集Java中的排序算法Java面试题合集——Java中的排序算法排序算法是计算机科学中的基本算法之一,而在Java编程语言中,也提供了多种排序算法的实现。

掌握常见的排序算法是Java开发者面试时的重要考点之一。

本文将介绍Java中一些常用的排序算法,并对它们的原理、应用场景和性能进行讨论。

一、冒泡排序(Bubble Sort)冒泡排序是一种简单但效率较低的排序算法,它的基本思想是通过不断交换相邻元素的位置,将较大或较小的元素逐渐“冒泡”到数组的一端。

具体实现如下:```javapublic static void bubbleSort(int[] arr) {int n = arr.length;for (int i = 0; i < n - 1; i++) {for (int j = 0; j < n - i - 1; j++) {if (arr[j] > arr[j + 1]) {int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}```冒泡排序的时间复杂度为O(n^2),因此对于大规模数据的排序效率较低。

但它的实现简单,对于小规模数据或基本有序的数据仍然具有一定优势。

二、选择排序(Selection Sort)选择排序是一种简单但效率较低的排序算法,它每次从待排序的元素中选择最小(或最大)的元素放到已排序的部分末尾。

通过不断选择并交换元素,实现整个数组的排序。

具体实现如下:```javapublic static void selectionSort(int[] arr) {int n = arr.length;for (int i = 0; i < n - 1; i++) {int minIndex = i;for (int j = i + 1; j < n; j++) {if (arr[j] < arr[minIndex]) {minIndex = j;}int temp = arr[i];arr[i] = arr[minIndex];arr[minIndex] = temp;}}```选择排序的时间复杂度同样为O(n^2),虽然在大规模数据的排序中效率较低,但由于每次只需交换一次元素,因此相对于冒泡排序而言,选择排序的性能略高。

java sort方法

java sort方法

java sort方法sort方法是一种对集合对象中的元素进行排序的一种方法。

它可以通过 Collections 包中的sort()方法实现排序。

sort 方法是在java开发中常用的一个操作,它可以根据任何自定义类型的数据进行排序。

它接受一个参数,即要排序的 List 对象。

借助 sort 方法,可以按以下不同方式对 List 中的元素进行排序:1.根据自然顺序对对象中元素进行排序,只有在 List 中的元素实现 Comparable 接口的情况下才可以;2.使用提供的 Comparator 对象来定义排序规则,即,使用 Comparator 来指定排序的元素;3.使用 Array.sort() 来排序数组中的元素,此方法可以接受两个参数,第一个参数指定要排序的数组,第二个参数指定排序规则,即 Comparator 接口实现。

因此,sort 方法可以根据提供的 Comparator 来排序 List 中的元素,而且可以设定排序的顺序是升序还是降序;sort 方法也可以根据元素实现 Comparable 接口的自然顺序来排序 List 中的元素。

使用 sort 方法时,应注意以下几点:(1)必须使用 synchronized 来同步方法,以防止并发更新;(2)不能保证排序的稳定性,即,相同的元素可能会被改变排序顺序;(3)使用异步线程时,不能保证完成排序的时间;(4)使用它来排序可变集合时,因为元素可能会发生变化,可能会出现无法排序的情况;(5)需要指定排序算法,而不是元素的实现比较方法;(6)由于Java自带的sort方法的排序是不稳定的,同样的元素也可能被排序,所以建议使用StableSort来解决这个问题。

所以,sort方法是一种非常有用的排序方法,它可以根据相应的排序规则将集合对象中的元素进行排序,使得数据有序且容易查找,从而大大提高了开发效率和性能。

java算法总结

java算法总结

java算法总结一、排序1、冒泡排序:t冒泡排序是一种简单的排序算法,它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。

走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。

这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

2、选择排序:t选择排序是一种简单直观的排序算法,无论什么数据进去都是O(n)的时间复杂度。

所以用到它的时候,数据规模越小越好。

唯一的好处可能就是不占用额外的内存空间了吧。

3、插入排序:t插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。

它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

4、希尔排序:t希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。

希尔排序是非稳定排序算法。

该方法的基本思想是:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。

二、查找1、线性查找:t线性查找又称顺序查找,是一种最简单的查找算法。

从数据结构线形表的一端开始,顺序扫描,依次将扫描到的结点关键字与给定值k相比较,若相等则查找成功;若扫描结束仍没有找到关键字等于k的结点,则表示表中不存在关键字等于k的结点,查找失败。

2、二分查找:t二分查找又称折半查找,要求待查找的序列有序。

每次取中间位置的值与待查关键字比较,如果中间位置的值更大,则在前半部分循环这个查找的过程,如果中间位置的值更小,则在后半部分循环这个查找的过程。

3、二叉查找树:t二叉查找树(Binary Search Tree,简称BST),又被称为二叉搜索树、有序二叉树。

它是一棵空树或者是具有下列性质的二叉树:若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;任意节点的左、右子树也分别为二叉查找树;没有键值相等的节点三、字符串处理1、KMP算法:tKMP算法是由Donald E.Knuth、Vaughn R. Pratt和James H.Morris三人于1977年提出的一种改进的字符串匹配算法,它利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。

java倒序排序方法

java倒序排序方法

java倒序排序方法java语言是一种面向对象的编程语言,具有强大的排序功能。

在java中,倒序排序是非常常见的操作,有多种实现方法。

一、使用Collections.reverseOrder()方法java中的Collections类提供了reverseOrder()方法,可以用于倒序排序,该方法返回一个比较器,可以将一个对象列表按照指定的顺序进行排序。

示例代码如下所示:```javaimport java.util.ArrayList;import java.util.Collections;import java.util.List;public class ReverseSortExample {public static void main(String[] args) {List<Integer> numbers = new ArrayList<>();numbers.add(5);numbers.add(2);numbers.add(9);numbers.add(1);numbers.add(7);System.out.println("排序前:" + numbers); Collections.sort(numbers, Collections.reverseOrder()); System.out.println("排序后:" + numbers);}}```输出结果如下所示:```排序前:[5, 2, 9, 1, 7]排序后:[9, 7, 5, 2, 1]```在这个示例中,我们创建了一个包含一些整数的列表,并使用Collections类的sort()方法对其进行排序。

通过传递`Collections.reverseOrder()`作为比较器参数,可以实现倒序排序。

值得注意的是,reverseOrder()方法返回的是一个比较器,它会根据元素的自然顺序进行排序。

java模拟面试题目(3篇)

java模拟面试题目(3篇)

第1篇一、Java基础知识1. 请简述Java语言的特点。

2. 什么是Java虚拟机(JVM)?它有什么作用?3. 什么是Java的内存模型?请解释Java内存模型中的几个关键概念:堆、栈、方法区、程序计数器、本地方法栈。

4. 什么是Java中的反射机制?请举例说明反射在Java中的应用。

5. 什么是Java中的泛型?请解释泛型的原理和作用。

6. 请简述Java中的四种访问控制符:public、protected、default、private。

7. 什么是Java中的继承和多态?请举例说明继承和多态在实际开发中的应用。

8. 什么是Java中的封装?请举例说明封装在实际开发中的应用。

9. 什么是Java中的接口和抽象类?它们之间有什么区别?10. 什么是Java中的异常处理?请解释try-catch-finally语句的执行顺序。

二、Java集合框架1. 请列举Java集合框架中的常用集合类及其特点。

2. 请简述ArrayList、LinkedList、HashMap、HashSet的区别。

3. 什么是Java中的泛型集合?请举例说明泛型集合的应用。

4. 什么是Java中的迭代器(Iterator)和枚举器(Enum)?请比较它们的区别。

5. 什么是Java中的List、Set、Map的遍历方法?6. 请解释Java中的ArrayList和LinkedList的内部实现原理。

7. 什么是Java中的HashMap的扩容机制?8. 什么是Java中的HashSet的内部实现原理?9. 请解释Java中的线程安全集合类,如CopyOnWriteArrayList、ConcurrentHashMap。

三、Java多线程与并发1. 什么是Java中的线程?请解释线程的创建、调度和同步。

2. 请简述Java中的线程状态,如新建、就绪、运行、阻塞、等待、超时等待、终止。

3. 什么是Java中的同步机制?请解释synchronized关键字的作用。

java面试题经典算法

java面试题经典算法经典算法在Java面试中经常被问及,因为它们可以展示面试者对基本数据结构和算法的理解程度。

以下是一些经典算法,我会逐个介绍它们。

1. 冒泡排序(Bubble Sort),这是一种简单的排序算法,它重复地走访要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。

时间复杂度为O(n^2)。

2. 快速排序(Quick Sort),快速排序使用分治法策略来把一个序列分为两个子序列。

它是一种分而治之的算法,时间复杂度为O(nlogn)。

3. 二分查找(Binary Search),二分查找是一种在有序数组中查找某一特定元素的搜索算法。

时间复杂度为O(logn)。

4. 递归算法(Recursion),递归是指在函数的定义中使用函数自身的方法。

递归算法通常用于解决可以被分解为相同问题的子问题的情况。

5. 动态规划(Dynamic Programming),动态规划是一种在数学、计算机科学和经济学中使用的一种方法。

它将问题分解为相互重叠的子问题,通过解决子问题的方式来解决原始问题。

6. 深度优先搜索(Depth-First Search)和广度优先搜索(Breadth-First Search),这两种搜索算法通常用于图的遍历和搜索。

深度优先搜索使用栈来实现,而广度优先搜索则使用队列来实现。

以上是一些常见的经典算法,当然还有很多其他的算法,如贪心算法、Dijkstra算法、KMP算法等等。

在面试中,除了了解这些算法的原理和实现方式之外,还需要能够分析算法的时间复杂度、空间复杂度以及适用场景等方面的知识。

希望这些信息能够帮助你在Java面试中更好地准备算法相关的问题。

阿里P 8专家爆出:入职阿里必备的598道java面试题,内含算法

前言之前也给大家分享过很多的面试题和大佬的面试经验,相信大家也已经利用到了,也顺利找到了工作,并拿到了高薪。

今天就给大家分享阿里P8专家长期以来面试所问到的java面试题,总共有598道(含算法),希望大家能够喜欢!!入职阿里598道JAVA题阿里P 8专家爆出:入职阿里必备的598道java面试题,内含算法第二版: Java17道1、JDK和JRE有什么区别?2、== 和equals 的区别是什么?3、两个对象的hashCode0相同,则equals0也- 定为true. 对吗?4、final在java 中有什么作用?5、java 中的Math.round(-1.5) 等于多少?6、String 属于基础的数据类型吗?7、java 中操作字符串都有哪些类?它们之间有什么区别?8、String str= "i"与String str=new String(i)一样吗?9、如何将字符串反转?10.String类的常用方法都有那些?11.抽象类必须要有抽象方法吗?12.普通类和抽象类有哪些区别?13.抽象类能使用final 修饰吗?14.接口和抽象类有什么区别?15.java中10流分为几种?16.BIO、NIO、AIO有什么区别?17.Files的常用方法都有哪些?阿里P 8专家爆出:入职阿里必备的598道java面试题,内含算法第二版: Java47道1.什么是Redis?简述它的优缺点?2.Redis 与memcached相比有哪些优势?3、Redis 支持哪几种数据类型?4、Redis 主要消耗什么物理资源?5.Redis 有哪几种数据淘汰策略?6、Redis 官方为什么不提供Windows版本?7.-一个字符串类型的值能存储最大容量是多少?8、为什么Redis需要把所有数据放到内存中?9、Redis 集群方案应该怎么做?都有哪些方案?10.Redis集群方案什么情况下会导致整个集群不可用?11、MySQL里有2000w数据,redis 中只存20w的数据,如何保证redis中的数据都是热点数据?12、Redis 有哪些适合的场景?(1)会话缓存(Session Cache)(2)全页缓存(FPC)(3)队列.(4)排行榜/计数器.(5)发布/订阅.13.Redis 支持的Java客户端都有哪些?官方推荐用哪个?1.为什么选择使用框架而不是原生?2、虚拟DOM的优劣如何?3、虚拟DOM实现原理......4、React最新的生命周期是怎样的?5、React 的请求应该放在哪个生命周期中?6、setState 到底是异步还是同步?-7.React 组件通信如何实现?8、React有哪些优化性能是手段?9、React 如何进行组件/逻辑复用?-...10.mixin. hoc、render props. react- hooks的优劣如何?11.你是如何理解fiber的?12、你对Time Slice 的理解?13、redux 的工作流程?14.react-redux 是如何工作的?15.redux 与mobx的区别?-16、redux 中如何进行异步操作?17、redux 异步中间件之间的优劣?.18、面向对象和面向过程的区别19.Java 语言有哪些特点?20、什么是字节码?采用字节码的最大好处是什么?什么Java是虚拟机?21.什么是Java虚拟机22.什么是Java程序的主类?应用程序和小程序的主类有何不同?23、什么是JDK?什么是JRE?24、环境变量Path和ClassPath的作用是什么?如何设置这两个环境变量?25.Java 应用程序与小程序之间有那些差别?26、字符型常量和字符串常量的区别-27.Java语言采用何种编码方案?有何特点?28、构造器Constructor是否可被override29、重载和重写的区别30、java面向对象编程三大特-----_封装、继承、多态31.java中equals方法的用法以及==的用法32、String 和StringBuffer. StringBuilder 的区别是什么? String 为什么是不可变的?33.自动装箱与拆箱34、类、方法、成员变量和局部变量的可用修饰符35.在一个静态方法内调用一个非静态成员为什么是非法的?36、在Java中定义一个不做事且没有参数的构造方法的作用37.import java和javax有什么区别?接口和抽象类的区别是什么?38、成员变量与局部变量的区别有哪些?39.创建-个对象用什么运算符?对象实体与对象引用有何不同?40什么是方法的返回值?返回值在类的方法里的作用是什么?41.一个类的构造方法的作用是什么?若-个类没有声明构造方法,改程字能正确执行吗?为什么?42.构造方法有哪些特性?43、静态方法和实例方法有何不同?44、对象的相等与指向他们的引用相等,两者有什么不同?45、在调用子类构造方法之前会先调用父类没有参数的构造方法。

java 排序规则

java 排序规则Java排序规则在Java中,排序是一项常见的操作,用于对数据进行整理和排列。

排序规则即决定了排序的方式和顺序,不同的排序规则可以根据需求选择合适的算法和方法。

下面将介绍几种常用的Java排序规则。

1. 字母排序字母排序是按照字母表的顺序对字符串进行排序。

在Java中,可以使用String类的compareTo方法来比较两个字符串的大小。

该方法返回一个int值,如果字符串相等则返回0,如果字符串在字母表中排在前面则返回负数,否则返回正数。

通过实现Comparator接口,可以自定义排序规则,实现对字符串数组的字母排序。

2. 数字排序数字排序是按照数字的大小对数据进行排序。

在Java中,可以使用Arrays类的sort方法对数组进行排序。

sort方法默认使用升序排序,即从小到大排列。

如果需要降序排序,可以使用Collections 类的reverseOrder方法。

通过实现Comparable接口,可以自定义排序规则,实现对自定义类对象的数字排序。

3. 时间排序时间排序是按照时间的先后顺序对数据进行排序。

在Java中,可以使用Date类或者Calendar类来表示时间,然后使用compareTo方法进行比较。

同样,通过实现Comparator接口,可以自定义排序规则,实现对时间的排序。

4. 自定义排序规则除了使用内置的排序方法和类,我们还可以自定义排序规则。

在Java中,可以通过实现Comparator接口来自定义排序规则。

Comparator接口有一个compare方法,可以根据自己的需求来实现比较逻辑。

比如,可以根据字符串的长度、数字的奇偶性等来排序。

5. 多字段排序有时候需要按照多个字段进行排序,比如先按照年龄排序,再按照姓名排序。

在Java中,可以使用多个Comparator对象来实现多字段排序。

可以使用Comparator的thenComparing方法来实现多字段排序,先按照第一个字段排序,如果相等再按照第二个字段排序,依次类推。

JAVA算法面试10题及答案

JAVA经典算法面试10题及答案【程序1】题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假设兔子都不死,问每个月的兔子总数为多少?1.程序分析:兔子的规律为数列1,1,2,3,5,8,13,21….【程序2】题目:判断101-200之间有多少个素数,并输出所有素数。

1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,那么说明此数不是素数,反之是素数。

【程序3】题目:打印出所有的“水仙花数“,所谓“水仙花数“是指一个三位数,其各位数字立方和等于该数本身。

例如:153是一个“水仙花数“,因为153=1的三次方+5的三次方+3的三次方。

1.程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。

【程序4】题目:将一个正整数分解质因数。

例如:输入90,打印出90=2*3*3*5。

程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:(1)如果这个质数恰等于n,那么说明分解质因数的过程已经结束,打印出即可。

(2)如果n <> k,但n能被k整除,那么应打印出k的值,并用n 除以k的商,作为新的正整数你,重复执行第一步。

(3)如果n不能被k整除,那么用k+1作为k的值,重复执行第一步。

【程序5】题目:利用条件运算符的嵌套来完成此题:成绩> =90分的同学用A表示,60-89分之间的.用B表示,60分以下的用C表示。

1.程序分析:(a> b)?a:b这是条件运算符的根本例子。

【程序6】题目:输入两个正整数m和n,求其最大公约数和最小公倍数。

1.程序分析:利用辗除法。

【程序7】题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。

1.程序分析:利用while语句,条件为输入的字符不为‘\n ‘. 【程序8】题目:求s=a+aa+aaa+aaaa+aa…a的值,其中a是一个数字。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Java排序算法1)分类:1)插入排序(直接插入排序、希尔排序)2)交换排序(冒泡排序、快速排序)3)选择排序(直接选择排序、堆排序)4)归并排序5)分配排序(箱排序、基数排序)所需辅助空间最多:归并排序所需辅助空间最少:堆排序平均速度最快:快速排序不稳定:快速排序,希尔排序,堆排序。

1)选择排序算法的时候1.数据的规模;2.数据的类型;3.数据已有的顺序一般来说,当数据规模较小时,应选择直接插入排序或冒泡排序。

任何排序算法在数据量小时基本体现不出来差距。

考虑数据的类型,比如如果全部是正整数,那么考虑使用桶排序为最优。

考虑数据已有顺序,快排是一种不稳定的排序(当然可以改进),对于大部分排好的数据,快排会浪费大量不必要的步骤。

数据量极小,而起已经基本排好序,冒泡是最佳选择。

我们说快排好,是指大量随机数据下,快排效果最理想。

而不是所有情况。

3)总结:――按平均的时间性能来分:1)时间复杂度为O(nlogn)的方法有:快速排序、堆排序和归并排序,其中以快速排序为最好;2)时间复杂度为O(n2)的有:直接插入排序、起泡排序和简单选择排序,其中以直接插入为最好,特别是对那些对关键字近似有序的记录序列尤为如此;3)时间复杂度为O(n)的排序方法只有,基数排序。

当待排记录序列按关键字顺序有序时,直接插入排序和起泡排序能达到O(n)的时间复杂度;而对于快速排序而言,这是最不好的情况,此时的时间性能蜕化为O(n2),因此是应该尽量避免的情况。

简单选择排序、堆排序和归并排序的时间性能不随记录序列中关键字的分布而改变。

――按平均的空间性能来分(指的是排序过程中所需的辅助空间大小):1)所有的简单排序方法(包括:直接插入、起泡和简单选择)和堆排序的空间复杂度为O(1);2)快速排序为O(logn ),为栈所需的辅助空间;3)归并排序所需辅助空间最多,其空间复杂度为O(n );4)链式基数排序需附设队列首尾指针,则空间复杂度为O(rd )。

――排序方法的稳定性能:1)稳定的排序方法指的是,对于两个关键字相等的记录,它们在序列中的相对位置,在排序之前和经过排序之后,没有改变。

2)当对多关键字的记录序列进行LSD方法排序时,必须采用稳定的排序方法。

3)对于不稳定的排序方法,只要能举出一个实例说明即可。

4)快速排序,希尔排序和堆排序是不稳定的排序方法。

4)插入排序:包括直接插入排序,希尔插入排序。

直接插入排序:将一个记录插入到已经排序好的有序表中。

1, sorted数组的第0个位置没有放数据。

2,从sorted第二个数据开始处理:如果该数据比它前面的数据要小,说明该数据要往前面移动。

首先将该数据备份放到 sorted的第0位置当哨兵。

然后将该数据前面那个数据后移。

然后往前搜索,找插入位置。

找到插入位置之后讲第0位置的那个数据插入对应位置。

O(n*n), 当待排记录序列为正序时,时间复杂度提高至O(n)。

希尔排序(缩小增量排序 diminishing increment sort):先将整个待排记录序列分割成若干个子序列分别进行直接插入排序,待整个序列中的记录基本有序时,再对全体记录进行一次直接插入排序。

插入排序Java代码:public class InsertionSort {// 插入排序:直接插入排序,希尔排序public void straightInsertionSort(double [] sorted){ int sortedLen= sorted.length;for(int j=2;j<sortedLen;j++){if(sorted[j]<sorted[j-1]){sorted[0]= sorted[j];//先保存一下后面的那个sorted[j]=sorted[j-1];// 前面的那个后移。

int insertPos=0;for(int k=j-2;k>=0;k--){if(sorted[k]>sorted[0]){sorted[k+1]=sorted[k];}else{insertPos=k+1;break;}}sorted[insertPos]=sorted[0];}}}public void shellInertionSort(double[] sorted, int inc){int sortedLen= sorted.length;for(int j=inc+1;j<sortedLen;j++ ){if(sorted[j]<sorted[j-inc]){sorted[0]= sorted[j];//先保存一下后面的那个int insertPos=j;for(int k=j-inc;k>=0;k-=inc){if(sorted[k]>sorted[0]){sorted[k+inc]=sorted[k];//数据结构课本上这个地方没有给出判读,出错:if(k-inc<=0){insertPos = k;}}else{insertPos=k+inc;break;}}sorted[insertPos]=sorted[0];}}}public void shellInsertionSort(double [] sorted){ int[] incs={7,5,3,1};int num= incs.length;int inc=0;for(int j=0;j<num;j++){inc= incs[j];shellInertionSort(sorted,inc);}}public static void main(String[] args) {Random random= new Random(6);int arraysize= 21;double [] sorted=new double[arraysize];System.out.print("Before Sort:");for(int j=1;j<arraysize;j++){sorted[j]= (int)(random.nextDouble()* 100);System.out.print((int)sorted[j]+" ");}System.out.println();InsertionSort sorter=new InsertionSort();// sorter.straightInsertionSort(sorted);sorter.shellInsertionSort(sorted);System.out.print("After Sort:");for(int j=1;j<sorted.length;j++){System.out.print((int)sorted[j]+" ");}System.out.println();}}5)交换排序:包括冒泡排序,快速排序。

冒泡排序法:该算法是专门针对已部分排序的数据进行排序的一种排序算法。

如果在你的数据清单中只有一两个数据是乱序的话,用这种算法就是最快的排序算法。

如果你的数据清单中的数据是随机排列的,那么这种方法就成了最慢的算法了。

因此在使用这种算法之前一定要慎重。

这种算法的核心思想是扫描数据清单,寻找出现乱序的两个相邻的项目。

当找到这两个项目后,交换项目的位置然后继续扫描。

重复上面的操作直到所有的项目都按顺序排好。

快速排序:通过一趟排序,将待排序记录分割成独立的两个部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。

具体做法是:使用两个指针low,high, 初值分别设置为序列的头,和序列的尾,设置pivotkey为第一个记录,首先从high开始向前搜索第一个小于pivotkey的记录和pivotkey所在位置进行交换,然后从low开始向后搜索第一个大于pivotkey的记录和此时pivotkey所在位置进行交换,重复知道low=high了为止。

交换排序Java代码:public class ExchangeSort {public void BubbleExchangeSort(double [] sorted){int sortedLen= sorted.length;for(int j=sortedLen;j>0;j--){int end= j;for(int k=1;k<end-1;k++){double tempB= sorted[k];sorted[k]= sorted[k]<sorted[k+1]?sorted[k]:sorted[k+1];if(Math.abs(sorted[k]-tempB)>10e-6){sorted[k+1]=tempB;}}}}public void QuickExchangeSortBackTrack(double [] sorted, int low,int high){if(low<high){int pivot= findPivot(sorted,low,high);QuickExchangeSortBackTrack(sorted,low,pivot-1);QuickExchangeSortBackTrack(sorted,pivot+1,high);}}public int findPivot(double[] sorted, int low, int high){sorted[0]= sorted[low];while(low<high){while(low<high && sorted[high]>= sorted[0])--high;sorted[low]= sorted[high];while(low<high && sorted[low]<=sorted[0])++low;sorted[high]= sorted[low];}sorted[low]=sorted[0];return low;}public static void main(String[] args) {Random random= new Random(6);int arraysize= 21;double [] sorted=new double[arraysize];System.out.print("Before Sort:");for(int j=1;j<arraysize;j++){sorted[j]= (int)(random.nextDouble()* 100);System.out.print((int)sorted[j]+" ");}System.out.println();ExchangeSort sorter=new ExchangeSort();// sorter.BubbleExchangeSort(sorted);sorter.QuickExchangeSortBackTrack(sorted, 1, arraysize-1);System.out.print("After Sort:");for(int j=1;j<sorted.length;j++){System.out.print((int)sorted[j]+" ");}System.out.println();}}6)选择排序:分为直接选择排序,堆排序直接选择排序:第i次选取 i到array.Length-1中间最小的值放在i 位置。

相关文档
最新文档