快速排序
使用了分治的思想
算法步骤:
1 从数列中挑出一个元素,称为 “基准”(pivot),
2 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
3 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。
算法图解:
一轮排序完毕,3左边的肯定小于3,3右边的肯定大于3
然后左右分别进行快速排序……
Java代码:
public static void quickSort(int[] a , int low,int high) {
int start = low;
int end = high;
int temp = a[start];//标记值
while (start < end){
//通行条件:while()中的值为停止循环条件,即标记值更小就停止循环
while (start < end && temp <= a[end]){
end--;
}
//再次确认标记值是否大于后面的值
if (temp > a[end]){
a[start] = a[end];
a[end] =temp;
}
while (start < end && temp >= a[start]){//标记值更大就停止循环
start++;
}
if (temp < a[start]){
a[end] = a[start];
a[start] = temp;
}
}
//当start >= end 时将跳出循环
//此时temp值一定会在数组的中间 即(a =2,1,3,4,6,5,), 左边比3小,右边比3大
if(start-1 > low ){
quickSort(a,low,start-1);
}
if(end+1<high){
quickSort(a,end+1,high);
}
}
初始化:a = [3, 5, 1, 4, 6, 2]
快排一次结果a--------[2, 1, 3, 4, 6, 5]
递归左
快排二次结果a--------[1, 2, 3, 4, 6, 5]
递归右
快排三次结果a--------[1, 2, 3, 4, 6, 5]
递归右
快排四次结果a--------[1, 2, 3, 4, 5, 6]