算法思想
将待排序集合以该集合中随机的一个数为分界点分成左右两个集合,一次排序使其右边的集合的数据全部大于左边的集合,然后再分别递归式的对左右两个集合执行上述排序操作,直到递归集合没有数据,递归结束完成排序。
算法描述
- 现有待排序数组s
- 令变量i=0,j=s.length
- 将待排序的数组s分成两个部分a和b,随机从a或b中取一个中间量temp
- 分别用开始用i变量从左向右遍历a,和用j变量从右向左遍历b,直到找到两个变量s[i]和s[j]使s[i]>temp和s[j]<temp并且i<j 然后交换两个变量,然后继续按照上述条件遍历,直到i>=j,使得集合b中的元素全部大于集合a中的元素
- 按照递归的方式,将a和b分别当作s继续过程2
public class Test{
static int a[]= new int[]{5,6,8,7,4,2,9,1,1,1,2,4,5,7,8,7,7,8};
public static void main(String args[]){
quick_sort(0,a.length-1);
for(int i=0;i<a.length;i++){
System.out.print(a[i]+" ");
}
System.out.println("--");
}
public static void quick_sort(int left,int right){
int i=left,j=right,k=a[left];
while(i<j){
while(i<j&&a[i]<k){
i++;
}
while(i<j&&a[j]>k){
j--;
}
if(i<j&&a[i]==a[j]){
i++;
}else{
int t=a[i];
a[i]=a[j];
a[j]=t;
}
}
if(i-1>left){
quick_sort(left,i-1);
}
if(right>j+1){
quick_sort(j+1,right);
}
}
}
时间空间复杂度
平均时间复杂度:O(nlogn)
平均空间复杂度:O(n)