1:概念
快速排序也叫分治法,它和冒泡排序选择排序不同,每排一次并不是找出最大或者是最小的的数字而是选择一个数字把该数字的左边都比它小(大)并且右边都比它大(小)。
2:排序过程
如:12 342 1 56 8 789 3 5 999 33 88经过一次排序后12的左边都比12大,12的右边都比12小。如下图所示
这样无序的数字被分成了3块。12的左边和右边都还可以继续分块。接下来把88当作参考数把 88 342 33 56 999 789 划分成88的左边都比88大,88的右边都比88小.
直到左右都不能划分的时候说明排序结束。附整体流程图
3:代码实现要点及程序运行过程截图
1:一般会有两个参数一个表示数组的开始位置(startIndex),一个表示数组结束位置(endIndex)。
2:循环结束判断依据为startIndex>=endIndex。
3:使用一个标志记录排序后该数的位置,使用递归的方式调用排序方法实现快速排序。示例代码为:divideArr(toSort,startIndex,flag-1);divideArr(toSort,flag+1,endIndex);
程序运行过程截图:
4:代码示例
public static void main(String[] args) {
/**
*快速排序(从小到大排序): 待排序
*/
int[] toSort={12,342,1,56,8,789,3,5,999,33,88};
System.out.print("未排序前结果:");
printTosort(toSort);
divideArr(toSort,0,toSort.length-1);
}
/**
*
* @param toSort :待排序的数组
* @param startIndex :数组起始位置
* @param endIndex:数组结束位置
*/
private static void divideArr(int[] toSort,int startIndex,int endIndex){
if(startIndex<endIndex){
int l=startIndex;
int r=endIndex;
int flag=l;//flag:标志位。通过排序后标志位的左边都比它小右边都比它大。
System.out.println();
System.out.println(" 标志位的值为:【"+toSort[flag]+"】");
System.out.println();
int tmp=0;//用来交换时临时存放数的变量。
while (l<r){
//从右边找比它小的数
while(flag<r&&toSort[flag]>toSort[r]){
r--;
}
if(r>flag){
//表示右边存在比标志位还小的数。
//1:右边的数和标志位互换。
//2:标志位重新标志位右边的下标
tmp=toSort[r];
toSort[r]=toSort[flag];
toSort[flag]=tmp;
flag=r;
}
//从左开始边找比它大的数
while(flag>l&&toSort[flag]<toSort[l]){
l++;
}
if(flag>l){
//说明左边出现比标志位还大的数。
//1:左边的数和标志位互换。
//2:标志位重新标志位左边的下标
tmp=toSort[l];
toSort[l]=toSort[flag];
toSort[flag]=tmp;
flag=l;
}
}
System.out.print("排序后结果:");
printTosort(toSort);
divideArr(toSort,startIndex,flag-1);
divideArr(toSort,flag+1,endIndex);
}
}
private static void printTosort(int[] toSort) {
for(int i=0;i<toSort.length;i++){
System.out.print(toSort[i]+" ");
}
System.out.println();
}
希望对看到文章的小伙伴有所帮助。有描述不正确的地方望指正。