递归快速排序算法
/**
* 快速排序 排成由小到大的
* @param arr 数组
* @param l 低位,开始一般为0
* @param h 高位,开始一般为 arr.length - 1
*/
// /**
// * 排成由小到大的
// */
private static void qsort(int[] arr,int l,int h){
if (l>h) return;
int i=l,j=h,a,temp;
// 基数赋值
a = arr[l];
while (i<j){
// 先看右边,依次往左递减,尝试找到一个比基数小的
while (i<j && arr[j] >= a){
// 所以,如果此数比基数大,并且j还在i右边,就j--继续寻找
j--;
}
// 再看左边,依次往右递增,尝试找到一个比基数大的
while (i<j && arr[i] <= a){
// 所以,如果此数比基数小,并且j还在i左边,就i++继续寻找
i++;
}
// 锁定i,j就可以交换了
if (i<j){
temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
}
// 当不满足i<j就结束循环
// 最后将基数与i位置的数字交换
arr[l] = arr[i];
arr[i] = a;
// 递归,左半边数组排序
qsort(arr,l,i-1);
qsort(arr,i+1,h);
}
最优 时间复杂度 O(nlogn)
最坏 O(n^2) (n-1 递归调用,第i 次需n-i 次比较)
平均 O(nlogn)
最优 空间复杂度 O(logn)
最坏 O(n) (需要进行n-1 次递归调用)
平均 O(logn)
非递归排序算法
参考博客https://blog.csdn.net/qq_26122557/article/details/79458649