接着上篇博客,這篇博客我們一起看看傳說中的算法(早知道這麼簡單,早點看看的話,阿里也就去了,淚奔....)。
面試常見的算法分爲兩種:排序算法和查找算法。
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);
}
}