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