算法和數據結構(二):算法

接着上篇博客,這篇博客我們一起看看傳說中的算法(早知道這麼簡單,早點看看的話,阿里也就去了,淚奔....)。

面試常見的算法分爲兩種:排序算法和查找算法。

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);
	}
}

 

發佈了119 篇原創文章 · 獲贊 23 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章