算法实现:
取待排序的第一个数为基数,找出它在整个区间的最终位置,找到它后,把整个区间分成两个子区间,
使得前面区间比它小,后面区间比它大。
遵循上述方法对各小区间进行同样的操作,直到各小区间只剩一个数,快速排序结束。
具体过程如下:
原始数列 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]);
}
}
}