快速排序,看图:
一轮排完之后,会将原数组分为左右两个子数组,且左边的子数组小于右边的子数组,利用递归,将子数组继续快排。
代码:
package sort;
import java.util.Arrays;
public class QuickSort {
public static void sort(int[] a, int low, int high) {
if(low >= high) return;
int i = low, j = high;
int key = a[i];
while(i < j) {
while(a[j]>= key && i < j) {
j--;
}
if(i < j) {
int t = a[i];
a[i] = a[j];
a[j] = t;
}
while(a[i] < key && i < j) {
i++;
}
if(i < j ) {
int t = a[i];
a[i] = a[j];
a[j] = t;
}
}
sort(a, low, i-1);
sort(a, i+1, high);
}
public static void main(String[] args) {
int[] a = {3,9,-4,0,16,7,20,5,2};
sort(a, 0, a.length-1);
System.out.println(Arrays.toString(a));
}
}
打印每次快排完的结果:
i: 0j: 8——>[2, 9, -4, 0, 16, 7, 20, 5, 3]
i: 1j: 8——>[2, 3, -4, 0, 16, 7, 20, 5, 9]
i: 1j: 3——>[2, 0, -4, 3, 16, 7, 20, 5, 9]
i: 3j: 3——>[2, 0, -4, 3, 16, 7, 20, 5, 9]
i: 0j: 2——>[-4, 0, 2, 3, 16, 7, 20, 5, 9]
i: 2j: 2——>[-4, 0, 2, 3, 16, 7, 20, 5, 9]
i: 0j: 0——>[-4, 0, 2, 3, 16, 7, 20, 5, 9]
i: 0j: 0——>[-4, 0, 2, 3, 16, 7, 20, 5, 9]
i: 4j: 8——>[-4, 0, 2, 3, 9, 7, 20, 5, 16]
i: 6j: 8——>[-4, 0, 2, 3, 9, 7, 16, 5, 20]
i: 6j: 7——>[-4, 0, 2, 3, 9, 7, 5, 16, 20]
i: 7j: 7——>[-4, 0, 2, 3, 9, 7, 5, 16, 20]
i: 4j: 6——>[-4, 0, 2, 3, 5, 7, 9, 16, 20]
i: 6j: 6——>[-4, 0, 2, 3, 5, 7, 9, 16, 20]
i: 4j: 4——>[-4, 0, 2, 3, 5, 7, 9, 16, 20]
i: 4j: 4——>[-4, 0, 2, 3, 5, 7, 9, 16, 20]
快速排序是所有同数量级的排序算法中,平均性能最好的,时间复杂度为O(n log n),最坏的情况下为O(n^2)。