面试三 : 快速排序

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

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

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

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

    基本思想 : 利用的是 分治法的基本思想数据结构

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

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

    一趟快速排序的算法是:spa

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

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

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

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

    5) 重复第 3 、四、 5步 直到 i == j 中止

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

    wKiom1QjdRKSUtUDAAH1Jl6kT3k882.jpg

        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);
		//递归要加终止条件  在上面
	}

}
相关文章
相关标签/搜索