Java实现面试常考的算法
Java 实现面试常考的算法
总结了几个平时面试问得一些算法题, 都是非常非常基础的问题.
查找算法
典型的二分查找 对于二分查找算法要求, 查找前的数据必须是已经排好序的, 然后得到数组的开始位置 start 和结束位置 end, 取中间位置 mid 的数据 a[mid]跟待查找数据 key 进行比较, 若 a[mid] > key, 则取 end = mid – 1; 若 a[mid] < key, 则取 start = mid + 1; 若 a[mid] = key 则直接返回当前 mid 为查找到的位置. 依次遍历直到找到数据或者最终没有该条数据. 啰嗦这么多, 上代码!!!
1//已经排好序的数组
2public static int binarySearch(int[] nums, int key) {
3 int start = 0;
4 int end = nums.length - 1;
5 int mid = -1;
6 while (start <= end) {
7 mid = (start + end) / 2;
8 if (nums[mid] == key) {
9 return mid;//已经查到返回!
10 } else if (nums[mid] > key) {
11 end = mid - 1;
12 } else if (nums[mid] < key) {
13 start = mid + 1;
14 }
15 }
16 return -1;
17}
排序算法
排序算法可以说是老生常谈的问题, 下面的代码思路是根据 严蔚敏的《数据结构》而来. 务必注意: 以下所有的排序算法都是从 1 开始, 而不是从 0 开始, 有的排序算法会把 0 位置当作监视哨 今天就介绍一下几种常见的排序算法:
排序之前先写一个交换方法后面会用到
1 //交换
2 private static void swap(int[] a, int i, int j) {
3 a[i] ^= a[j];
4 a[j] ^= a[i];
5 a[i] ^= a[j];
6 }
插入排序
插入排序的基本思想是,经过 i-1 遍处理后,L[1..i-1]己排好序。第 i 遍处理仅将 L[i]插入 L[1..i-1]的适当位置,使得 L[1..i] 又是排好序的序列。要达到这个目的,我们可以用顺序比较的方法。首先比较 L[i]和 L[i-1],如果 L[i-1]≤ L[i],则 L[1..i]已排好序,第 i 遍处理就结束了;否则交换 L[i]与 L[i-1]的位置,继续比较 L[i-1]和 L[i-2],直到找到某一个位置 j(1≤j≤i-1),使得 L[j] ≤L[j+1]时为止。图 1 演示了对 4 个元素进行插入排序的过程,共需要(a),(b),(c)三次插入 稳定,时间复杂度 O(n^2)
1//插入排序
2public static void insertSort(int[] a) {//a0为监视哨位置,不作为数据存储
3 int len = a.length;
4 for (int i = 2; i < len; i++) {
5 if (a[i - 1] > a[i]) {
6 a[0] = a[i];
7 a[i] = a[i - 1];
8 int j = 0;
9 for (j = i - 2; a[j] > a[0]; j--) {
10 a[j + 1] = a[j];
11 }
12 a[j + 1] = a[0];
13 }
14 }
15}
选择排序
选择排序的基本思想是对待排序的记录序列进行 n-1 遍的处理,第 i 遍处理是将 L[i..n]中最小者与 L[i]交换位置。这样,经过 i 遍处理之后,前 i 个记录的位置已经是正确的了。 不稳定, 时间复杂度 O(n^2)
1//选择排序
2 public static void selectSort(int[] a) {
3 for (int i = 1; i < a.length; i++) {
4 int j = selectMinKey(a, i); //从i开始a.length中找到最小的位置
5 if (i != j) {
6 swap(a, i, j);
7 }
8 }
9 }
10
11 // 查找从i开始到a.length中最小的位置
12 private static int selectMinKey(int[] a, int i) {
13 int key = i;
14 for (int j = i + 1; j < a.length; j++) {
15 if (a[j] < a[key]) {
16 key = j;
17 }
18 }
19 return key;
20 }
冒泡排序
冒泡排序方法是最简单的排序方法。这种方法的基本思想是,将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮。在冒泡排序算法中我们要对这个“气泡”序列处理若干遍。所谓一遍处理,就是自底向上检查一遍这个序列,并时刻注意两个相邻的元素的顺序是否正确。如果发现两个相邻元素的顺序不对,即“轻”的元素在下面,就交换它们的位置。显然,处理一遍之后,“最轻”的元素就浮到了最高位置;处理二遍之后,“次轻”的元素就浮到了次高位置。在作第二遍处理时,由于最高位置上的元素已是“最轻”元素,所以不必检查。一般地,第 i 遍处理时,不必检查第 i 高位置以上的元素,因为经过前面 i-1 遍的处理,它们已正确地排好序。 稳定,时间复杂度 O(n^2)
1 //冒泡排序
2 public static void bubbleSort(int[] a) {
3 int len = a.length;
4 for (int i = 1; i < len - 1; i++) {
5 for (int j = i; j < len - i; j++) {
6 if (a[j + 1] < a[j]) {
7 swap(a, j + 1, j);
8 }
9 }
10 }
11 }
快速排序
不稳定,时间复杂度 最理想 O(nlogn) 最差时间 O(n^2) 快速排序是对冒泡排序的一种本质改进。它的基本思想是通过一趟扫描后,使得排序序列的长度能大幅度地减少。在冒泡排序中,一次扫描只能确保最大数值的数移到正确位置,而待排序序列的长度可能只减少 1。快速排序通过一趟扫描,就能确保某个数(以它为基准点吧)的左边各数都比它小,右边各数都比它大。然后又用同样的方法处理它左右两边的数,直到基准点的左右只有一个元素为止。
1 //快速排序
2 public static void quickSort(int[] a, int low, int high) {
3 //递归快速排序
4 int pivotLoc = 0;//中心点
5 if (low < high) {
6 pivotLoc = partitionLoc(a, low, high);
7 quickSort(a, low, pivotLoc-1);
8 quickSort(a, pivotLoc+1, high);
9 }
10 }
11
12 //获取到a的下标 low ~ high 中, a[low]的应该放的位置, 即左边的数 < a[low] 右边的数 > a[low]
13 private static int partitionLoc(int[] a, int low, int high) {
14 a[0] = a[low];
15 while (low < high) {
16 while (low < high && a[high] >= a[0]) {
17 high--;
18 }
19 a[low] = a[high];
20 while (low < high && a[low] <= a[0]) {
21 low++;
22 }
23 a[high] = a[low];
24 }
25 a[low] = a[0];
26 return low;
27 }
Note: 在这里就属快速排序稍微有些复杂, 但是这也是常考一个算法, 仔细看代码中的注释应该能明白, 一起加油. 原文地址:http://www.jianshu.com//p/3539c3b70646
内容声明 | |
---|---|
标题: Java实现面试常考的算法 | |
链接: https://zixizixi.cn/articles/2017/02/13/1486979370718.html | 来源: iTanken |
本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可,转载请保留此声明。 |
(function() { try { var days = parseInt((new Date().getTime() - new Date(document.querySelector('.article time').innerText.replace(/ /g, '').replace(/-/g, '/')).getTime()) / 864e5, 10); days > 90 && document.querySelector('section.item__content').insertAdjacentHTML('afterBegin', ['<blockquote style="border: 1px solid #6a737d;border-width: 1px 5px;text-align: center;line-height: 36px;padding: 0 10px;">\u672c\u6587\u6700\u540e\u66f4\u65b0\u4e8e <code style="color: #FF5722;vertical-align: middle;">', days, '</code> \u5929\u524d\uff0c\u5185\u5bb9\u53ef\u80fd\u5df2\u7ecf\u4e0d\u591f\u51c6\u786e\uff0c\u8bf7\u914c\u60c5\u53c2\u8003\uff01</blockquote>' ].join('')); kbnBgImgRandom(); gitalk && gitalk.render('gitalk-container'); } catch(e) {} })();
我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=wh4u6zpyhe1d
相关文章
- 什么是java常量「建议收藏」
- java使用md5_Java_MD5的使用「建议收藏」
- java冒泡排序经典代码_Java 8大经典排序算法(含源代码),必须收藏!
- java 环境配置(详细教程)「建议收藏」
- 编写java判断闰年_Java 判断闰年代码实例
- setproperty java_Java中System.setProperty()的用法
- java中scanner是什么意思_java中Scanner是什么?怎么用?
- Java Web(五)Web
- 【说站】java向上转型发生的时机
- 大数据必学Java基础(五十九):Map接口源码部分
- java softreference_Java引用总结–StrongReference、SoftReference、WeakReference、PhantomReference…[通俗易懂]
- 一致性hash面试题_java面试算法
- java异常处理
- 技术直播:1小时突击Java工程师面试核心(限免报名)
- Java拼音拆分算法详解编程语言
- 约瑟夫环算法Java实现代码详解编程语言
- Java实现的各种排序算法(包括冒泡,快排等)详解编程语言
- Java数据结构学习笔记之二Java数据结构与算法之栈(Stack)实现详解编程语言
- Java技术学习路线图详解编程语言
- java File读取本地文件,判断是否存在详解编程语言
- 数据库实现Java程序与Oracle数据库的连接(java链接oracle)
- 处理Java使用Redis操作实现数据过期管理(redisjava过期)
- 有Java操作Redis实现过期缓存机制(redisjava过期)
- Java如何查询MySQL?25字(java查询mysql)
- 深入认识Java面试与MySQL及其思考(java面试mysql)
- Redis面试中Java相关技术面试题汇总(redis面试题java)
- JAVA/JSP学习系列之七(Orion下自定义Tag)
- 浅谈java中静态方法的重写问题详解
- java中String的一些方法深入解析
- java实现区域内屏幕截图示例