java 冒泡排序和快速排序 实现

面试的时候经常会遇到面试官让你直接手写排序算法,下面是冒泡排序和快速排序的实现。

冒泡排序

基本流程就是,自下而上比较相邻的两个元素进行比较,让大的元素往下面沉,较小的往上冒。按照排序规则进行比较,如果是跟排序的规则相反就需要调整互换。

package cn.test1;

import org.apache.commons.lang.ArrayUtils;

public class BubbleSort {

	public static void main(String[] args) {
		int[] array = { 1, 12, 34, 3, 56, 6, 9, 10, 12 };
		bubbleSort(array);

		for (int i : array) {
			System.out.println(i);
		}
	}

	public static void bubbleSort(int[] array) {
		if (ArrayUtils.isEmpty(array)) {
			return;
		}

		int length = array.length;
		for (int i = 0; i < length - 1; i++) {
			for (int j = 1; j < length - 1; j++) {
				if (array[j] > array[j + 1]) {
					int temp = array[j];
					array[j] = array[j + 1];
					array[j + 1] = temp;
				}
			}
		}

	}

}

快速排序:

基本思想:先找准基数,随意选择数组一个元素,作为基数,不过一般选择数组头或者尾作为基数,如果选择了其他的元素,也要首先交换到末尾或者头。

分区过程:比基数大的放在右边,比基数小的放在左边。重复下去就可以排序了。

看下代码,自己试试,debug一下,会更清楚些。

package cn.test1;

public class QuickSort {

	public static void main(String[] args) {
		QuickSort qs = new QuickSort();
		int[] array = { 78, 34, 12, 64, 5, 4, 62, 99, 98, 5, 18, 23, 34, 15, 51 };
		qs.sort(array);
	}

	public void sort(int[] array) {
		quickSort(array, 0, array.length - 1);
	}

	/**
	 * 通过划分,基于分治思想,递归执行子任务排序最后合并
	 * 
	 * @param low
	 *            数组首位索引
	 * @param high
	 *            数组末尾索引
	 */
	public void quickSort(int[] array, int low, int high) {
		int middleIndex;
		if (low < high) {
			middleIndex = getMiddleIndex(array, low, high);
			quickSort(array, low, middleIndex - 1);
			quickSort(array, middleIndex + 1, high);
		}
	}

	/**
	 * 简单划分方法
	 */
	public int getMiddleIndex(int[] array, int i, int j) {
		int pivot = array[i]; // array[i] 就是 第一个坑

		while (i < j) {
			while (i < j && array[j] >= pivot) {
				j--; // 从右向左找出小于基准数pivot的数来填充array[i]
			}

			if (i < j) {
				array[i] = array[j]; // 将array[j]填充到array[i]中,array[j]就形成了一个新的坑
				i++;
			}

			while (i < j && array[i] <= pivot) {
				i++; // 从左向右找出大于基准数pivot的数来填充array[j]
			}

			if (i < j) {
				array[j] = array[i]; // 将array[i]填充到array[j]中,array[i]就形成了一个新的坑
				j--;
			}
		}
		array[i] = pivot; // 退出时,i等于j。将pivot填到这个坑中。
		return i;
	}
}

点赞