一、快排核心思想
快排核心思想就是:首先在待排序数组中随便选择一个数作为节点(pivot),然后从最后面(high)往左查找比这个节点(pivot)小的数,并且从最前面(low)往右查找比这个节点(pivot)大的数(low),情况1:找到后就把这两个数进行交换,然后接着上面的查找交换直到low等于high,球后将节点(pivot)与low位置处的数进行交换,这样比pivot小的数都在其前面,比pivot大的数就在其后面,然后把数组以pivot分为两半,重复上述操作;情况2:直到low 等于 high都没有找到,就直接交换pivot和low位置的数据,然后同样的将数组以pivot分为两半重复上述操作。(说的挺抽象的,还是看看下面举例吧)
二、实例
以数组{6,3,7,1,9,4,8,5,2,10}为例。
1.为了便于理解,就以6作为节点,开始排序时low等于6,high等于10
2.从由右往左找比节点6小的数就是2,从左往右找比节点6大的数就是7,把这两个数交换(这样查找的目的是为了将大的数放后面,较小的数放前面)
交换后:
3.交换后,high接着往左找比节点6小的数,同时low接着往右找比6大的数,分别是5和9,交换low和high
交换后:
4.接着相同操作,high往左找到比6小的数4,low往右找大于节点6的数时,low与high相遇,那么本轮查找就结束。接着节点6与low和high的相遇点4交换。这样比6小的数都在其前面,比6da的数都在其后面。
交换后:
5.一轮操作结束后,原数组被节点6“一分为二”,分别是比6都小的4,3,2,1,5和比6都大的8,9,7,10两个数组。接着就将这两个数组重复上面的操作,操作完成后理论上是数组被“一分为四”,四个数组再进行上面的操作如此循环
三、代码实现(java)
public class QuickSort {
//快排实现方法
public static void quickRow(int[] array, int low, int high){
int i,j,pivot;
//结束条件
if (low >= high) {
return;
}
i = low;
j = high;
//选择的节点,这里选择的数组的第一数作为节点
pivot = array[low];
while (i < j){
//从右往左找比节点小的数,循环结束要么找到了,要么i=j
while (array[j] >= pivot && i < j){
j--;
}
//从左往右找比节点大的数,循环结束要么找到了,要么i=j
while (array[i] <= pivot && i < j){
i++;
}
//如果i!=j说明都找到了,就交换这两个数
if (i < j){
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
//i==j一轮循环结束,交换节点的数和相遇点的数
array[low] = array[i];
array[i] = pivot;
//数组“分两半”,再重复上面的操作
quickRow(array,low,i - 1);
quickRow(array,i + 1,high);
}
//测试
public static void main(String[] args) {
int[] array = {6,3,7,1,9,4,8,5,2,10};
int low = 0,high = array.length - 1;
quickRow(array,low,high);
for (int i : array){
System.out.println(i);
}
}
}