老生常谈 排序算法---快速排序

来源:互联网 发布:vb.net format 编辑:程序博客网 时间:2024/05/17 09:32

关于快速排序,我觉得是必须掌握的排序算法,因为这个算法真的是很奇妙,不知道发明者当初是怎么想出来的。

这种基于分治策略的算法平均时间复杂度基本都是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);}}


0 0
原创粉丝点击