快速排序是一种平均复杂度为O(nlog n)的排序算法。对一个序列A[1]、A[2]...A[n],调整序列的元素位置,使得A[s](1<s<n)都有A[1]—A[s-1]都不超过A[s],A[s]右侧的元素都不小于A[s]。
快速排序的思想:
1、调整序列中的元素,是当前序列最左端的元素在调整后满足左侧所有元素均不超过改元素,右侧所有元素均不大于该元素。
2、对该元素左端和右端的序列分别递归调用第一步,直到当前调整的区间长度不超过1.
例子:
我们发现,快排的第一轮有一个确定的位置,第二轮多了2个确定位置,第三轮多了4个位置,那么我们通过类比在第n轮,将会多出2^(n-1)个确定位置。由此推断在递归调用n轮的快速排序的时候,将会有2^n-1个确定位置。
现在我们可以确定一个函数2^y-1=x,所以当x=n时,y=log(n+1),因此如果有n个数进行快排,共需要log(n+1)轮,时间复杂度为O(logn),每一轮里需要对n个数进行排序,所以总的时间复杂度为O(nlogn)。
public static void QuickSort(int[] arr,int left,int right){
int i=left;
int j=right;
int temp=arr[left];
while(i<j){
if(arr[i+1]<temp){
int sum=arr[i+1];
arr[i+1]=arr[i];
arr[i]=temp;
i++;
} else{
int num=arr[j];
arr[j]=arr[i+1];
arr[i+1]=num;
j--;
}
}
if(i-1>left)QuickSort(arr,left,i-1);
if(j+1<right)QuickSort(arr,j+1,right);
}