快速排序是综合性能非常好的一种排序方法,它的思想是:每次选取一个数,将序列中所有比该数据小的数放到一边,反之放到另一边,然后对该数据左边的序列和右边的序列分别利用相同的方法进行继续排序。同样,以数字序列5,3,2,1,4为例,分析快排的排序过程,根据描述可以初步得出排序过程,这里以一个表格的形式展示:
这里每次选取的数都是数组最右边的那个数字,这里第二行的排序结果是怎么出来的呢?我们还是用一张图加以解释:
就像描述的那样,第一次排序是把不比4大的数放到4的左边,反之放到右边,图中蓝色和红色的原点代表遍历数组的下标,在遍历的过程中,有对数据位置的调换。下面给出示例代码:
public class my{ public static void main(String[] args){ int arr[]={1,4,23,0,4,5,34,23,4354,23,12}; quicksort(arr,0,arr.length-1); printArray(arr); } static void quicksort(int[] array,int left,int right){ if(left<right){ int position=pos(array,left,right); quicksort(array,left,position-1); quicksort(array,position+1,right); } } //调换数据位置,同时返回最右边那个数据最终应处的位置的下标 static int pos(int[] array,int left,int right){ //这里每次选取的数都是数组最右边的那个数 int i=left,j=left,rightval=array[right],temp=0; for(;i<right;){ if(array[i]>rightval){ i++; }else{//array[i]<=rightval temp=array[i]; array[i]=array[j]; array[j]=temp; i++; j++;//array[j]存放的是比rigthval大的数 } } temp=rightval; array[right]=array[j]; array[j]=temp; return j; } static void printArray(int[] array){ for(int val:array){ System.out.print(val+" "); } System.out.println(); } }
最后输出结果:0 1 4 4 5 12 23 23 23 34 4354
算法分析:快排算法时间复杂度是O(nlogn),且排序过程不稳定。