”在算法中,快速排序也是一个比较经典的排序,速度也是如其名,非常的快速,具体思想是通过确立一个基准数(为数组的开头),然后从两头依次寻找比他小和比他大的数,一定要先从范围的末尾开始寻找比他小的数(这样可以防止找到最后会换到一个比他大的数到左边去),最后这两个头尾寻找的指针会相遇,这个时候就要停下来了,将他们共同指向的那个数和基准数调换位置,此步叫做“基准数归位“,此步之后,就可以将比基准数小的所有数会到它的左边去,比基准数大的所有数会到它的右边,然后由这个基准数为中心再分为两个区间,重复上面的操作(利用递归算法即可),最后就可以完成排序了!
例如以下的数组:
int[]arr = {5,8,1,6,2,7,3,9,4,10};
第一步先确定基准数(为数组的开头) 即为5,然后设置头和尾的指针,分别指向5,10。然后从10开始寻找比基准数(5)要小的数,找到则停止,例如找到4,然后停止,这个时候才从头开始寻找比基准数5要大的数,即为8,然后停止,这时候就需要将8和4进行一个交换得到以下数组:
int[]arr = {5,4,1,6,2,7,3,9,8,10};
此时尾指向的是8,头指向的是4 ,从尾部开始继续寻找比基准数小的数,即为3,然后开始头的寻找,于是找到了6,然后交换,得到以下数组:
int[]arr = {5,4,1,3,2,7,6,9,8,10};
此时尾指向的是6,头指向的是3,从尾部开始寻找,找到了2,头则开始寻找,但是这时候头和尾的指针指向同一个数,即为2,于是这个时候则要停止寻找,然后执行基准数归位的操作,即将2与基准数(5)进行一个换位,得到以下数组:
int[]arr = {2,4,1,3,5,7,6,9,8,10};
所以此时,比基准数大的数就会跑到右边,比基准数小的数就会跑到左边,这样便完成了快速排序的第一趟,利用递归,继续排序基准数左右两边的区间,左边区间范围为(0,基准数-1) 右边区间的范围为(基准数+1,数组.length-1),这样就可以重复以上排序方法,最后将所有的数排好。
具体代码实现如下所示:
public class Quicksort {
public static void main(String[] args) {
int[]arr = {5,8,1,6,2,7,3,9,4,10};
quick(arr,0,arr.length-1);
//以下为打印结果
for (int k = 0; k < arr.length; k++) {
System.out.print(arr[k] + " ");
}
}
private static void quick(int[] arr, int i, int j) {
int start = i;
int end = j;
if(start > end){
return;
}
int baseNum = arr[start];
while (start!=end){
while (true){
if(start>=end || arr[end] < baseNum){
break;
}
end--;
}
while (true){
if(start>=end || arr[start] > baseNum){
break;
}
start++;
}
int temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
}
int temp = arr[i];
arr[i] = arr[start];
arr[start] = temp;
//排序基准数的左区间
quick(arr,i,start - 1);
//排序基准数的右区间
quick(arr,start + 1,j);
}
}
效果图如下: