快速排序算法:
- 实现:先在数组中选择一个数字(默认首位数字),接下来把数组中的数字分为两部分,比选择数字小的移到数组的左边,比选择数字大的移到数组右边。递归进行,知道数组有序。
- 复杂度:平均复杂度O(nlogn) 最坏复杂度O(n^2),体现在数组基本有序,每次选取最后一个作为比较数字的情况。
代码:
import java.util.Random; public class Solution { public static int Partition1(int[] data, int l, int r) { // 方法1 int tmp = data[l]; // swap(data[l],data[r]) data[l] = data[r]; data[r] = tmp; int mid = l - 1; for (int index = l; index < r; index++) { if (data[index] < data[r]) { mid++; if (mid != index) { tmp = data[index]; // swap(data[index],data[mid]) data[index] = data[mid]; data[mid] = tmp; } } } mid++; tmp = data[mid]; // swap(data[mid],data[r]) data[mid] = data[r]; data[r] = tmp; return mid; } public static int Partition2(int[] data, int l, int r) { // 方法2 int x = data[l]; while (l < r) { while (l < r && data[r] >= x) { r--; } data[l] = data[r]; while (l < r && data[l] <= x) { l++; } data[r] = data[l]; } data[l] = x; return l; } public static void QuickSort(int[] data, int l, int r) { if (l >= r) { return; } int mid = Partition1(data, l, r); //int mid = Partition2(data, l, r); QuickSort(data, l, mid - 1); QuickSort(data, mid + 1, r); } public static void main(String[] args) { int[] data = new int[10]; Random random = new Random(); for (int i = 0; i < 10; i++) { data[i] = random.nextInt(10); } System.out.printf("原数组:"); for (int d : data) { System.out.printf("%d ", d); } QuickSort(data, 0, data.length - 1); System.out.println(); System.out.printf("排序后:"); for (int d : data) { System.out.printf("%d ", d); } } }