关于快速排序,我觉得是必须掌握的排序算法,因为这个算法真的是很奇妙,不知道发明者当初是怎么想出来的。
这种基于分治策略的算法平均时间复杂度基本都是nlgn,快速排序优点是不需要像归并排序一样占用额外空间。
快速排序的思路就是以某一个数字作为分割,一般是以第一个或者最后一个,然后从左边找比它大的跟右边找到的比它小的互换,最后实现左边的值都比此值小,右边值都比它大。然后对它分割开的序列再次如此,直到序列为1个值结束,完整成个排序过程。
代码如下:
其中Partition2就是上面的思路,Partition是以右边值为分割值的方法,我还是上面图中的思路更习惯一点。
package exam.sorts;
public class QuickSort {
public static int Partition(int a[],int p,int r){
int x=a[r];
int i=p-1;
int temp;
for(int j=p;j<=r-1;j++){
if(a[j]<=x){
// swap(a[j],a[i]);
i++;
System.out.println(j+" "+i);
temp=a[j];
a[j]=a[i];
a[i]=temp;
show(a);
}
}
//swap(a[r,a[i+1]);
temp=a[r];
a[r]=a[i+1];
a[i+1]=temp;
show(a);
return i+1;
}
public static int Partition2(int a[],int p,int r){
int x=a[p];
int i=p+1;
int j=r;
int temp;
do{
while(a[i]<x){
i++;
}
while(a[j]>x){
j--;
}
if(i<j){
temp=a[i];
a[i]=a[j];
a[j]=temp;
}else{
break;
}
show(a);
}while(true);
temp=a[p];
a[p]=a[j];
a[j]=temp;
show(a);
return j;
}
public static void QuickSort(int a[],int p,int r){
if(p<r){
int q=Partition2(a,p,r);
QuickSort(a,p,q-1);
QuickSort(a,q+1,r);
}
}
public static void show(int a[]){
for (int i=0;i<10;i++)
System.out.print(a[i]+ " ");
System.out.println();
}
public static void main(String[] stra){
int a[]={23,53,77,36,84,76,93,13,45,23};
show(a);
QuickSort(a,0,9);
show(a);
}
}