Java快速排序算法

来源:互联网 发布:淘宝卖家申请直播 编辑:程序博客网 时间:2024/05/20 14:25

Java快速排序主要思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

一个快排的数据移动图例:



代码:

public class QuickSort {public static void main(String []args){int a[]=new int[100];//随机生成100个三位数放到数组a中for(int i=0;i<100;i++){a[i]=(int)(Math.random()*1000);}Quick quick=new Quick();quick.sort(a, 0, a.length-1);for(int j=1;j<=100;j++){System.out.print(a[j-1]+" ");if(j%10==0){System.out.println();}}}}class Quick{public int partition(int a[],int i,int j){while(i<j){//此处a[i]为标量//此while加if语句将i右侧小于标量的值(a[i]的值)挪到标量的左边while(i<j&&a[i]<a[j])j--;if(i<j){int temp=a[i];a[i]=a[j];a[j]=temp;i++;//此处i++是因为下处while循环时无需再(重复)比较一次刚才已交换过的值//故将i++注释掉程序结果依然正确}//此while加if语句将i左侧大于标量的值(arr[j]的值)挪到标量的右边while(i<j&&a[i]<a[j])i++;if(i<j){int temp=a[i];a[i]=a[j];a[j]=temp;j--;}}//当i不小于j(即i=j)时表示所有数字已经被查找了一遍,该遍执行的结果为//该标量左边的数都小于标量,右边的数都大于标量//所以该标量所处位置i(=j)处的值已排完,可以固定不变//至此数组元素的位置调整了一遍,同时一个元素的位置确定,返回该位置return i;//return j;}public void sort(int arr[],int l,int r){//当l=r时,不进入下层sort循环,转而执行下面的语句if(l<r){//key为数组a划分一遍之后标量的位置int key=partition(arr,l,r);//递归调用sort函数//因为key处的值位置已确定,故分为(l,key-1)和(key+1,r)//每层sort调用时key不停变换,但是函数永远是先排好各key左边的元素顺序//sort函数一层复一层地调用自己,直到l<key-1才执行本层!的sort(a,key+1,r);sort(arr,l,key-1);sort(arr,key+1,r);}}}


或者可以将两个函数简化为如下一个:

public class QuickSortS{public static void main(String []args){//int a[]={31,-24,3,34,542,32,234,-3,33,23,2,3};int a[]=new int[100];for(int i=0;i<100;i++){a[i]=(int)(Math.random()*1000);}Quick1 quick=new Quick1();quick.sort(a,0,a.length-1);for(int l=1;l<=a.length;l++){System.out.print(a[l-1]+" ");if(l%10==0){System.out.println();}}}}class Quick1{public void sort(int[]arr,int l,int r){if(l<r){int i=l,j=r;while(i<j){while(i<j&&arr[i]<=arr[j])j--;if(i<j){int temp=arr[i];arr[i]=arr[j];arr[j]=temp;i++;}while(i<j&&arr[i]<=arr[j])i++;if(i<j){int temp=arr[i];arr[i]=arr[j];arr[j]=temp;j--;}}sort(arr,l,i-1);sort(arr,i+1,r);}}}


运行结果如下:

2 22 22 27 31 31 46 56 64 65 
66 78 137 137 142 159 166 168 173 176 
180 180 207 214 222 238 240 241 246 281 
294 299 312 324 328 344 346 353 361 379 
388 411 415 423 433 442 460 461 462 466 
473 474 477 485 500 524 538 582 583 588 
593 599 629 631 648 653 658 666 667 682 
687 691 691 691 708 728 729 730 761 764 
770 797 811 814 815 820 825 838 841 855 
856 881 924 936 936 960 961 973 982 984 

0 0