接着上篇博客,这篇博客我们一起看看传说中的算法(早知道这么简单,早点看看的话,阿里也就去了,泪奔....)。
面试常见的算法分为两种:排序算法和查找算法。
1.排序算法
面试题目:给定任意的一个无序数组,用 你熟悉的算法做一个排序(建议自己手写一遍,编辑器里敲一遍,别面试时才慢慢想)。
1.1 冒泡排序
(1)逐个比较相邻的两个元素,将较大的值往后放
(2)第一轮比较完最大的元素放数组最后,第二轮剩下的元素里最大的元素放数组倒数第二位...
public class SortTest {
public static void main(String[] args) {
int[] arr = { 1, 5, 3, 2, 4, 6, 9, 8, 7 };
System.out.println(Arrays.toString(bubble_sort(arr)));
}
public static int[] bubble_sort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
int m = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = m;
}
}
}
return arr;
}
}
需要注意的是,内层循环的条件是j<arr.length-1-i。如果不这样做,最后的结果就是会多比较很多次。而且,for循环中用i<arr.length来避免数组下表越界。
1.2 选择排序
(1)遍历相邻的两个元素,找到最小元素的下标,将该元素移动到数组第一位;
(2)从数组第二位开始重复执行(1)中的步骤
public class SortTest {
public static void main(String[] args) {
int[] arr = { 1, 5, 3, 2, 4, 6, 9, 8, 7 };
System.out.println(Arrays.toString(select_sort(arr)));
}
public static int[] select_sort(int[] arr) {
for (int i = 0; i < arr.length; i++) {
int min = i;
for (int j = i; j < arr.length; j++) {
if (arr[j] < arr[min]) {
min = j;
}
}
if (min != i) {
int t = arr[min];
arr[min] = arr[i];
arr[i] = t;
}
}
return arr;
}
}
1.3 插入排序
(1)比较第一个元素和第0个元素大小,并将第一个元素插入到合适位置;
(2)比较第二个元素和前两个元素大小,并将第二个元素插入到合适位置;
(3)将所有元素按照(2)中的步骤执行
public class SortTest {
public static void main(String[] args) {
int[] arr = { 1, 5, 3, 2, 4, 6, 9, 8, 7 };
System.out.println(Arrays.toString(insert_sort(arr)));
}
public static int[] insert_sort(int[] arr) {
for (int i = 0; i < arr.length; i++) {
int insert = arr[i];
int j = i - 1;
for (j = i - 1; j >= 0 && arr[j] > insert; j--) {
arr[j + 1] = arr[j];
}
arr[j + 1] = insert;
}
return arr;
}
}
1.4 快速排序
public class SortTest {
public static void main(String[] args) {
int[] array = { 8, 4, 3, 9, 6, 7, 2, 1 };
quickSort(array, 0, array.length - 1);
System.out.println(Arrays.toString(array));
}
public static void quickSort(int array[], int left, int right) {
if (left >= right) {
return;
}
int key = array[left];
int i = left;
int j = right;
while (i < j) {
while (array[j] >= key && i < j) {
j--;
}
while (array[i] <= key && i < j) {
i++;
}
if (i < j) {
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
array[left] = array[i];
array[i] = key;
quickSort(array, left, i - 1);
quickSort(array, i + 1, right);
}
}