算法和数据结构(二):算法

接着上篇博客,这篇博客我们一起看看传说中的算法(早知道这么简单,早点看看的话,阿里也就去了,泪奔....)。

面试常见的算法分为两种:排序算法和查找算法。

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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章