快速排序(QuickSort)
快速排序(QuickSort)属于交换类排序,是通过元素间不断的比较和移动实现的。它的实现,增大了记录移动的距离,通过前后两个指针,依次与基准元素(一般为序列第一个元素或三数取中)进行比较,将比基准元素小的移动到基准前面,比基准元素大的移动到基准后面,通过一趟排序后,基准的位置是其最终位置,并将序列划分为两个子序列,左边子序列元素均小于基准,右边子序列均大于基准,然后采用分治思想,将两个子序列分别递归进行快排,直到子序列中元素为空或只有一个,此时,整个序列有序。其时间复杂度为:O(nlogn)
快排的精髓为
- 划分:即通过某趟排序确定出当前基准位置,并由基准将当前序列划分为两个子序列,左子序列元素均小于基准,右子序列元素均大于基准
- 递归:采用分治思想对子序列递归调用
快排的Java代码如下:
package QuickSort;
import java.util.Arrays;
/**
* @author John
* @date 13/05/2018 5:36 PM
* @email swjtuzbkoo@gmail.com
*/
public class quickSort {
public void sort(int[] arr, int low, int high) {
if (low >= high) { //递归结束条件,当左侧指针>=右侧指针时,结束
return;
}
int index = partition(arr, low, high);
sort(arr, low, index - 1); //递归处理左子序列
sort(arr, index + 1, high); //递归处理右子序列
}
public int partition(int[] arr, int low, int high) {//划分
int key = arr[low]; //以序列第一个元素为基准
while (low < high) {
while (low < high && arr[high] >= key) { //从后面向前扫描,移动右侧指针
high--;
}
arr[low] = arr[high];
while (low < high && arr[low] <= key) { //从前面向后扫描,移动左侧指针
low++;
}
arr[high] = arr[low];
}
arr[low] = key;
return low;
}
public static void main(String[] args) {
quickSort qs = new quickSort();
int[] arrays = new int[]{1, 12, 2, 13, 3, 14, 4, 15, 5, 16, 17, 17, 177, 18, 8, 8, 19};
System.out.println("排序前为:"+Arrays.toString(arrays));
qs.sort(arrays, 0, arrays.length - 1);
System.out.println("排序后为:"+Arrays.toString(arrays));
}
}
运行结果如下:
排序前为:[1, 12, 2, 13, 3, 14, 4, 15, 5, 16, 17, 17, 177, 18, 8, 8, 19]
排序后为:[1, 2, 3, 4, 5, 8, 8, 12, 13, 14, 15, 16, 17, 17, 18, 19, 177]
Process finished with exit code 0