快速排序
原理:
经过一趟排序 会把数组分成两段 一段比当前数大 一段比当前数小 左边以及右边的继续按照这种方式排序 直到完成所有排序。
稳定性:不稳定
时间复杂度:平均 O(nlogn) 最坏情况为O(n^2)
图解:
初始数组【49,38,65,97,76,13,27】
第一次排序流程如下:
把整个序列看做一个数组,把第零个位置看做中轴,和最后一个比,如果比它小交换,比它大不做任何处理;交换了以后再和小的那端比,比它小不交换,比他大交换。这样循环往复,一趟排序完成,左边就是比中轴小的,右边就是比中轴大的,然后再用分治法,分别对这两个独立的数组进行排序。
public class QuickSort2 {
public static void main(String[] args) {
int[] a = { 49, 38, 65, 97, 76, 13, 27 };
quick(a);
for (int num : a) {
System.out.print(" " + num);
}
}
private static void quick(int[] a) {
if (a != null) {
quickSort(a, 0, a.length - 1);
}
}
private static void quickSort(int[] a, int low, int high) {
if (low < high) {
int mid = getMid(a, low, high);
System.out.println(mid);
quickSort(a, low, mid - 1);
quickSort(a, mid + 1, high);
}
}
private static int getMid(int[] a, int low, int high) {
int temp = a[low];
while (low < high) {
while (low < high && a[high] >= temp) {
high--;
}
// 如果跳出循环 说明发现了比temp的小的值,移到左边去
a[low] = a[high];
while (low < high && a[low] <= temp) {
low++;
}
// 如果跳出循环 说明发现了比temp的大的值 ,移到右边去
a[high] = a[low];
}
a[low] = temp;
return low;
}
}