前言
快速排序应该是应用最广泛的排序算法了,它实现简单,一般情况下比其他算法都要快。快速排序算法用到了递归的方法,它将数组的一个元素作为参照物,然后小于该元素的数据放到该元素的左边,大于该元素的数据放到该元素的右边,再以相同的方法对左边的数据和右边的数据进行操作,最后实现整个数组的有序
1,快速排序
下面的代码是普通的快速排序代码
代码:
import java.util.Scanner;
public class QuickSort {
public static void Quick(int data[],int s,int t) {
int i=s;
int j=t;
int temp;
if(s<t) {
temp=data[s];
while(i!=j) {
while(j>i && data[j]>=temp) j--;
data[i]=data[j];
while(i<j && data[i]<=temp) i++;
data[j]=data[i];
}
data[i]=temp;
Quick(data,s,i-1);
Quick(data, i+1, t);
}
}
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int num=s.nextInt();
int data[] = new int[num];
for(int i=0;i<num;i++) {
data[i] = s.nextInt();
}
Quick(data,0,num-1);
for(int i=0;i<num;i++) {
System.out.print(data[i]+" ");
}
}
}
分析:
然后我在想该怎么说呢
。。。
算了,直接写一段排序过程更直接
- 这里我们输入十个数,然后以第一个数也就是6为参照元素temp,i 指向6,j 指向5
- 第一次while循环,从 j 开始,此时 j 指向的5是小于temp的,所以 j 不变,将 j 指向的值5赋值给 i 所在的位置,然后此时i指向的值就是5了,5是小于temp的,所以i++,此时 i 指向8,大于temp,所以 i 不变,把 i 指向的值8赋值给 j 所在的位置,这样第一次while循环就结束了,结果如第二行所示。
- 后面还会有几个while循环,和上面的操作都是一样的,当 i==j 时,while循环结束,讲temp赋值给 i 或者 j 所在的位置,这样快速排序的第一步就完成了。
- 此时 temp的左边都是小于他的数,对它们也进行上面的操作,于是就有了Quick(data,s,i-1); 同样的Quick(data, i+1, t);对右边的数排序
2,三向切分的快速排序
上面的快速排序确实很简单,但是有一个问题,那就是如果数据有很多重复的元素,那么上面的算法就会浪费很多时间对相同的元素进行排序,三向切分的快速排序是对快速排序的一种优化,适合处理含有重复元素的数据
public static void Quick2(int data[],int s,int t) {
int i=s;
int j=t;
int k=s+1;
int temp=data[s];
if(t>s) {
while(k<=j) {
//change(int data[],int a,int b)
//将数组下标为a和b的元素互换
if(data[k]<temp) change(data,i++,k++);
else if(data[k]>temp) change(data,k,j--);
else k++;
}
Quick2(data, s, i-1);
Quick2(data, j+1, t);
}
}