递归思想:先选数组第一个值作为枢轴,将比枢轴大的值放在右边,比枢轴小的值放在左边。再把中枢左右两侧的两个数组执行相同操作,直到要执行的数组只有一个元素时停止。
对枢轴左右值换位置的操作:双指针法,low,high分别指向数组的最左和最右,初始low指向枢轴。移动high找到比枢轴小的元素,停止移动并交换low、high指针所指的元素,此时high指向枢轴。再移动low找到比枢轴大的元素,停止移动并交换low、high指针所指的元素,此时low指向枢轴(与初始情况相同),交替执行上述操作直到low==high。这里的程序如下:
while(low < high){
while(low < high && n[high] >= n[low])
high--;
swap(n, low, high);
while(low < high && n[low] <= n[high])
low++;
swap(n, low, high);
}
交换之后low==high。返回low值进行递归操作。注意交换的函数要引入数组n作形参才能真正完成数据的交换。
所有程序:
package Algorithms;
public class KuaisuSort {
public static void main(String[]args){
int[] n = {32, 2, 322, 5, 1242, 8, 12};
for(int i: n){ //打印原顺序数据
System.out.print(i + "\t");
}
System.out.println();
qSort(n, 0, n.length - 1);
for(int i: n){ //打印排序后数据
System.out.print(i + "\t");
}
}
public static void qSort(int[] n, int low, int high){
if(low < high){
int pivot = partition(n, low, high);
qSort(n, low, pivot-1);
qSort(n, pivot+1, high);
}
}
public static int partition(int[] n, int low, int high){
while(low < high){
while(low < high && n[high] >= n[low]) //从右侧开始找小于pivotkey的值跳出循环,右侧大于等于pivotkey的值不需要改变位置
high--;
swap(n, low, high); //将右侧小于pivotkey的值与privotkey交换,此时privotkey被交换到了high
while(low < high && n[low] <= n[high]) //从左侧开始找大于pivotkey的值跳出循环,左侧小于等于pivotkey的值不需要改变位置
low++;
swap(n, low, high); //将左侧大于privotkey的值与high也就是privotkey交换,此时privotkey被交换到了low
}
return low; //此时low=high是privotkey的位置
}
public static void swap(int[] n, int p, int q){
if(p != q){
n[p] = n[p] ^ n[q];
n[q] = n[p] ^ n[q];
n[p] = n[p] ^ n[q];
}
}
}