快速排序
排序原理:
- .找一个基准值,用两个指针分别指向数组的头部和尾部;
- 先从尾部向头部开始搜索一个比基准值小的元素,搜索到即停止,并记录指针的位置;
- 再从头部向尾部开始搜索一个比基准值大的元素,搜索到即停止,并记录指针的位置;
- 交换当前左边指针位置和右边指针位置的元素;
- .重复2,3,4步骤,直到左边指针的值大于右边指针的值停止。
演示
代码
public class QuickSort {
public static void main(String[] args) {
int[] arr = {14, 21, 2, 32, 29, 43, 43, 13, 12, 30, 19, 34, 38, 8, 48};
sort(arr);
for (int a : arr) {
System.out.print(a + ", ");
}
}
public static void sort(int[] arr) {
sort(arr, 0, arr.length - 1);
}
public static void sort(int[] arr, int left, int right) {
if (left < right) {
int index = partition(arr, left, right);
sort(arr, left, index - 1);
sort(arr, index + 1, right);
}
}
public static int partition(int[] a, int lo, int hi) {
int key = a[lo];
int left = lo;
int right = hi + 1;
while (true) {
while (key < a[--right]) {
if (right == lo) {
break;
}
}
while (a[++left] < key) {
if (left == hi) {
break;
}
}
if (left >= right) {
break;
} else {
int tmp = a[left];
a[left] = a[right];
a[right] = tmp;
}
}
int tmp = a[lo];
a[lo] = a[right];
a[right] = tmp;
return right;
}
}
时间复杂度:O(nlogn)
|