快速排序及其算法描述:
快速排序是一种比较高效的比较类排序算法,相比冒泡排序,快排中的每一轮比较是跳跃式的,为什么说是跳跃式的比较呢?这个问题待会再细说。
通过一轮比较将基数定位(一般按从小到大),并将数据一分为二,基数前面的数均比基数小,基数后面的数均比基数大,之后再对这两组数据分别继续进行比较。这就回到了刚才的问题:冒泡排序每一轮比较只是将比较区相邻两个数进行比较,对比较区最大的数据定位(大数沉淀,小数冒泡,一般按从小到大排序),而快速排序每一轮比较定位的基数的位置是可以不具有特殊性的,而且实现了将数据二分的功能,就不用像冒泡排序那样每次只进行相邻的数的比较,所以说是跳跃式的比较,通常能大大减小比较的次数,速度也就能大大提升了.
快速排序的平均时间复杂度为O(nlgn),当然最坏的情况下进行的是基数与相邻的数的比较和交换,时间复杂度为O(n2).
[关于快排时间复杂度的分析推荐看这位博主的文章:](https://blog.csdn.net/weshjiness)
接下来就是代码实现了:
public class QuickSort {
public static int[] sort(int[] arr, int first, int last) {
int i = first;
int j = last;
int t;
//设置递归出口
if (first > last)
return arr;
//设置基数,一般取首位上的数据
int base = arr[first];
while (i < j) {
//从后面往前找小于基数的数据,标记
//基数取第一个时必须先从后往前走,否则会出现以下情况:
//基数本身在比较的数据中是最小的时,必然导致基数与后一位数据进行交换,且不可逆
//很明显此时得到的二份数据已经不是最初设计快排算法时想要得到的数据了
while (arr[j] >= base && i < j) {
j--;
}
//从前面往后找大于基数的数据,标记
while (arr[i] <= base && i < j) {
i++;
}
//交换前面标记的两个数据
if (i < j) {
t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}
//交换基数与定位后位置上的数
arr[first] = arr[i];
arr[i] = base;
//对左边数据递归调用快排
sort(arr, i + 1, last);
//对右边数据递归调用快排
sort(arr, first, i - 1);
return arr;
}
public static void main(String[] args) {
int[] arr = new int[] {6,1,5,4,8,3,10,9,2};
sort(arr, 0, arr.length - 1);
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
}
}