前言:据说很多公司面试官都喜欢让被面试者手撸快排。所以你也应该掌握!
快速排序是不稳定的,最好情况时间复杂度为O(nlogn),最坏是O(n平方),平均时间复杂度为O(nlogn),空间复杂度为O(logn)。
import java.util.Arrays;
public class Main {
/**
* 相当于包了一层这样只用传入一个参数即可
* @param keys
*/
public static int[] quickSort(int[] keys){ //快速排序(升序)
return quickSort(keys,0,keys.length-1);
}
//对存于keys数组begin到end之间的子序列进行一趟快速排序,递归算法。
private static int[] quickSort(int[] keys,int begin,int end) {
if(begin>=0 && begin<keys.length && end>=0 && end<keys.length && begin<end){
int i = begin, j= end; //i,j下标分别从子序列的前后两端开始
int vot = keys[i]; //子序列第一个值作为基准值
while(i<j){
while(i<j && keys[j]>=vot) //从后向前寻找较小值,不移动与基准值相等元素
j--;
if(i<j){
keys[i++] = keys[j]; //子序列后端较小元素向前移动
}
while(i<j && keys[i]<=vot) //从前向后寻找较大值,不移动与基准值相等元素
i++;
if(i<j){
keys[j--] = keys[i]; //子序列前端较大元素向后移动
}
}
keys[i] = vot; //基准值到达最终位置
System.out.print(begin + ".." +end+ ", vot="+vot+" ");
System.out.println(Arrays.toString(keys));
quickSort(keys, begin, j-1); //前端子序列再排序,递归调用
quickSort(keys, i+1, end); //后端子序列再排序,递归调用
}
return keys;
}
public static void main(String[] args) {
int[] keys = {38,38,97,75,61,19,26,49};
int[] sortResult = quickSort(keys);
System.out.println(Arrays.toString(sortResult));//Arrays.toString(array)
}
}