今天咱们看看快速排序,其实咱们是在大二上学期上的数据结构,如今基本上忘的差很少了,最近这两年一直在作应用,因此这个面试官给我敲响了警钟,虽说我面试的结果不怎么样,可是个人收获仍是不少的,在这里与你们分享一下。但愿你们在面试以前,必定要看看咱们经常使用的算法,这是常常考的,还有就是面试官会问你算法复杂度,这是个很头疼的问题,一开始学的时候就不会,但愿哪一个大神有好的算算法复杂度的方法,请指教。
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 中止
这样第一趟排序就完成了,这样就保证了 基准元素左面的元素都比基准元素小 ,基准元素右面的元素都比基准元素大 ,下面进行的就是在分别对基准元素左边的(元素都比基准小)数组进行排序(和第一趟排序步骤同样)和右边的数组进行排序。(递归)
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); //递归要加终止条件 在上面 } }