快速排序是对气泡排序的一种改进。
基本思想:通过一趟排序将待排序列分割成独立的两部分,其中一部分元素的排序码均比另一部分的排序码小,分别对这两部分继续进行排序,直至整个序列有序。
具体过程:设待排序列为 A[s..t],选取任意一个元素作为支点(基准元素,一般就选A[s]),然后从区间两端向中间依次比较元素,一旦发现前半部分有元素大于基准元素,后半部分有元素小于基准元素,则交换这两个元素,所有元素比较一遍后,最后把基准元素交换到两部分的中间,使得所有比基准元素大的都排在此基准元素的后面;所有比基准元素小的都放在此基准元素的前面。即该基准元素把序列 A[s..t] 分成两部分,此过程称为一次划分。
public class SortTest {
public static void main(String[] args) {
int[] arr = { 49, 38, 65, 97, 76, 13, 27, 49 };
display("原始数据 : ", arr);
// 快速排序
quickSort(arr, 0, arr.length - 1);
display("排序结果:", arr);
}
// 交换元素
public static void swap(int[] arr, int a, int b) {
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
// 显示
public static void display(String str, int[] arr) {
System.out.println(str);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
// 快速排序
public static void quickSort(int[] arr, int s, int t) {
// 递归算法,对区间a[s] ~a[t] 进行快速排序
int i = s + 1, j = t;
int temp = 0;
int x = arr[s]; // 第一个为基准元素
while (i <= j) {
// 从左到右
while (i <= j && arr[i] <= x) {
i++;
}
// 从右到左
while (i <= j && arr[j] >= x) {
j--;
}
if (i < j) {
//temp = arr[i];
//arr[i] = arr[j];
//arr[j] = temp;
swap(arr, i, j);
i++;
j--;
}
}
// 交换基准元素
if (s != j) {
arr[s] = arr[j];
arr[j] = x;
}
// 处理左区间
if (s < j - 1) {
quickSort(arr, s, j - 1);
}
// 处理右区间
if (j + 1 < t) {
quickSort(arr, j + 1, t);
}
}
}
原始数据 :
49 38 65 97 76 13 27 49
排序结果:
13 27 38 49 49 65 76 97