快速排序算法

来源:互联网 发布:sublimetext3 mac 编辑:程序博客网 时间:2024/06/05 11:30

算法实现:

取待排序的第一个数为基数,找出它在整个区间的最终位置,找到它后,把整个区间分成两个子区间,

使得前面区间比它小,后面区间比它大。

遵循上述方法对各小区间进行同样的操作,直到各小区间只剩一个数,快速排序结束。

具体过程如下:

原始数列 8  4  12  6  1  5  10  由小到大快速排序

初始:        8  4  12  6  1  5  10   这里以8为基数  8下标为i   最后一个数10下标为j

第一趟 :   5  4  12  6  1  8  10    由上看出8和10比较,10大,不交换     从10开始往左边选数和基数8比较, 找到5和 8比,8大,交换  换过之后,从5开始往右选数与基数8比较

                  5  4   8  6  1  12  10    由上看出4和8比较不换     12和8比较,12大,交换  8就去到了前面。这个时候从12开始往左边选数与基数8比较

  5    4   1  6  8  12  10    由上看出  1和8 比较  8大  交换  8去后面,1去前面。  然后从1开始往右选数与基数8比较   6比8小,不换

  [5  4  1  6] 8  [12  10]    第一趟排序结束  以8为基数  把数列分为两个区间。再对两个区间分别使用这种方法排序  

直到每个区间被分的只剩下一个数,快速排序结束。

所以这里就用到了递归。

具体实现如下:

package com.sort;/* * 快速排序算法 * num[]待排序数组 *  *  * */public class QuickSort {//对从num[L]到num[R]的元素进行排序public static  void quickSort(int num[],int l,int r){int temp;//用来保存基准数int i=l,j=r;if(l<r){temp=num[l];while(i!=j){//判断排序是否结束while(j>i && num[j]>temp){//从右边往左扫描,找到一个小于temp的元素--j;}if(i<j){                    num[i]=num[j];/*找到后放在temp的左边,下标右移一位*/i++;}while(j>i && temp>num[i]){//从左往右扫描,找到一个大于temp的元素i++;}if(i<j){num[j]=num[i]; /*找到后放在temp的右边,下标左移一位*/j--;}}num[i]=temp;//将temp放在最终位置quickSort(num, l, i-1);//递归对temp左边元素排序quickSort(num, i+1, r);//递归对temp又边元素排序}}public static void main(String[] args) {int[] num={2,3,4234,4,52,12,1212,32442};quickSort(num,0,7);for(int i=0;i<num.length;i++){System.out.println(num[i]);}}}