今天我们看看快速排序,其实我们是在大二上学期上的数据结构,现在基本上忘的差不多了,最近这两年一直在做应用,所以这个面试官给我敲响了警钟,虽然说我面试的结果不怎么样,但是我的收获还是很多的,在这里与大家分享一下。希望大家在面试之前,一定要看看我们常用的算法,这是经常考的,还有就是面试官会问你算法复杂度,这是个很头疼的问题,一开始学的时候就不会,希望哪个大神有好的算算法复杂度的方法,请指教。

    下面我们看看快速排序的思想 和 java实现

    快速排序是对冒泡排序的一种改进。

    不稳定,时间复杂度 最理想 O(nlogn)最差时间O(n^2)

    基本思想 : 利用的是 分治法的基本思想

    通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要小,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

    我们看一下快速排序的步骤:

    一趟快速排序的算法是:

    1) 设置两个变量 i 和 j  排序开始的时候, i = 0   j = N -1   (N 为数组的长度

    2)选取基准元素,通常选取数组的第一个元素为基准元素 key = arr[0]

    3)  从 j 开始向前搜索,即由后向前(j--)搜索  ,找到第一个小于key的值 arr[j] 将arr[i] 和 arr[j]进行交换 然后停止

    4) 从 i 开始向后搜索,即由前向后(i++)搜索, 找到第一个大于key的值 arr[i]  将arr[i] 和 arr[j] 进行交换 然后停止

    5) 重复第 3 、4、 5步 直到 i == j 停止

    这样第一趟排序就完成了,这样就保证了 基准元素左面的元素都比基准元素小 ,基准元素右面的元素都比基准元素大 ,下面进行的就是在分别对基准元素左边的(元素都比基准小)数组进行排序(和第一趟排序步骤一样)和右边的数组进行排序。(递归)

    面试三 : 快速排序_快速排序

        java 算法实现:

        

package cn.edu.ytu.botao.java.sort;
/**
 * 
 * @author botao
 *
 */
public class Quicksort {
	
	public static void main(String[] args) {
		//需要排序的数组 arr 并初始化数组
		int[] arr = {49,38,65,97,76,13,27};
		Quicksort quicksort = new Quicksort();
		quicksort.sort(arr, 0, arr.length-1);
		quicksort.print(arr);
	}
	/**
	 * 将数组元素输出
	 * @param arr
	 */
	public void print(int[] arr) {
		for (int i = 0; i < arr.length; i++) {
			if (i == arr.length-1) {
				System.out.print(arr[i]);
			}else {
				System.out.print(arr[i] + ",");
			}
		}
	}
	/**
	 * 
	 * @param arr 要排序的数组
	 * @param low 开始的下标
	 * @param high 结束的下标
	 */
	public void sort(int[] arr ,int low, int high) {
		//令 i = 开始的下标 令 j = 结束的下标
		int i = low;
		int j = high;
		
		//递归的终止条件
		if (i > j) {
			return ;
		}
		
		/**
		 * 注意: 递归终止的条件一定要在选取基准元素之前 否则会出现下标越界
		 */
		
		//基准元素 一般为数组的第一个元素
		int key = arr[low];
		
		/**
		 * 第一趟排序开始
		 */
		//进行第一趟排序
		while (true) {
			//从后面往前走 j--
			while (j > i) {
				//基准元素 大于 后面的元素 所以要将前面的元素和后面的元素进行交换
				if (arr[j] < key) {
					int temp = arr[j];
					arr[j] = arr[i];
					arr[i] = temp;
					break;  //完成一次循环 退出
				}else {
					j--; 
				}
			}
			//从前面往后走 
			while (j > i) {
				//基准元素 小于 前面的元素 所以要将后面的元素与前面的元素进行交换 
				if (arr[i] > key) {
					int temp = arr[j];
					arr[j] = arr[i];
					arr[i] = temp;
					break;  //完成一次循环 退出
				}else {
					i++;
				}
			}
			//完成一趟循环 退出
			if (j == i) {
				break;
			}
		}
		/**
		 * 第一趟排序结束
		 */
		
		//完成第一趟循环后进行重复性递归
		//分而治之的左面的数组
		sort(arr, low, i-1);
		//分而治之的右面的数组
		sort(arr, i+1, high);
		//递归要加终止条件  在上面
	}

}