输入为n个数,快速排序期望时间复杂度为 O(nlgn),最坏时间复杂度为 O(n^2)
- 算法过程
输入为n个数据的数组A[n],快速排序试图找到一个中间数据,把该数据放置中间,这样就分成了两个子数组,左边的子数组都小于中间数,右边的都大于中间数,用同样的方法对子数组进行排序,直到数组全部排序完成。
这里涉及了一个递归的思想在里面。算法的关键也是如何在一组数据中找到该中间值
提供的思路如下: 记输入数组为A[low,high]
(1)选取数组最后一个数据A[high-1]为参照值index,设置两个lable变量i,j。初始值i为low-1,j为low。
(2)以j为循环变量,从0开始遍历数组至倒数第二位A[high-2],会出现两种情况:
A[j]>index,此时不作交换数值操作,j++,遍历继续
A[j]<=index,交换A[j]和A[++i],j++,遍历继续
(3)遍历结束后,交换index与A[i+1],返回i+1,i+1即为中间值的下标记为mid,那么原来A[n]的数组则被分成A[0...mid-1]和A[mid+1,n-1]两个子数组
(4)递归调用,直到low>=high,表示数组所有元素都排序完成。
2.代码实现
import java.util.Arrays;
public class QuickSort {
public static void main(String[] args) {
int[] a=new int[] {2,5,36,15,9,6,45,36}; //随机给定一个无序数组
int[] b=quickSort(a,0,a.length);
System.out.println(Arrays.toString(b));
}
//找出中间值,并返回其下标
public static int partition(int[] a,int low, int high) {
//标记值初始化
int i=low-1;
int j=low;
int index=a[high-1];
//开始遍历
while(j<high-1) {
if(a[j]>index)
j++;
else {
int temp=a[++i];
a[i]=a[j];
a[j++]=temp;
}
}
//遍历结束后交换中间值
a[high-1]=a[++i];
a[i]=index;
//返回中间值下标
return i;
}
//快速排序
public static int[] quickSort(int[] a,int low,int high) {
if(low<high-1) {
int mid=partition(a,low,high);
//递归调用
quickSort(a,low,mid);
quickSort(a,mid,high);
}
return a;
}
}