选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一次扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在器拍好序后的正确位置,然后在用同样的方法递归地划分的两部分。
package test.algorithm.FastSlowPointer;
public class QuickSort {
/**
* 元素交换
* @param k
* @param low
* @param high
*/
public static void swap(int k[], int low, int high)
{
int temp;
temp = k[low];
k[low] = k[high];
k[high] = temp;
}
/**
* 划分
* @param list
* @param low
* @param high
* @return
*/
public static int partition(int[] list,int low,int high){
//数组的第一个作为中值
int point = list[low];
while(low < high){
//从高位遍历,获取比中值小的下标(high)
while(low<high && list[high]>=point){
high--;
}
//比中值小的记录移到低端
list[low] = list[high];
//从低位遍历,获取比中值大的下标 (low)
while(low<high && list[low]<=point){
low++;
}
//比中值大的记录移到高端
list[high] = list[low];
}
// low和hight相等,这就是point在整个排序中的位置
// 低端的都比 point小,高端的都比point大
list[low] = point;
return low;
}
/**
* 快速排序
* @param list
* @param low
* @param high
*/
public static void QSort(int[] list, int low, int high){
int point = 0;
if(low < high){
//将list数组进行一分为二
point = partition(list,low,high);
//对低位序列进行递归排序
QSort(list,low,point-1);
//对高位序列进行递归排序
QSort(list,point+1,high);
}
}
/**
* 快速排序
* @param list
*/
public static void quickSort(int[] list){
QSort(list,0,list.length-1);
}
public static void main(String[] args) {
int[] list = {4, 2, 5, 0, 3, 9, 1, 7, 6, 8};
quickSort(list);
System.out.print("打印数组:");
for(int i :list){
System.out.print(i+" ");
}
}
}
