快速排序是对冒泡排序的一种改进,假设有一个数组要进行排序,首先选用数组的第一个数作为基准值,其余比基准值小的数放在它的左边,比基准值大的数放在它的右边
一次快速排序的算法是:
设置两个变量:i,j
第一次比较
从j开始向前搜索,即由后(右)开始向前(左)搜索(j--),找到第一个小于k的值j,将j和i下标的值互换;
假设用户输入了如下数组:
下标
|
0
|
1
|
2
|
3
|
4
|
5
|
数据
|
6
|
2
|
7
|
3
|
8
|
9
|
排序开始时:i=0,j=5
创建变量i=0(指向第一个数据), j=5(指向最后一个数据), k=6(
赋值为第一个数据的值也就是基准值)。
把所有比k小的数移动到k的左边,然后开始寻找比6小的数,从j开始,从右往左找,不断递减变量j的值,找到第一个下标3的数据比6小,于是把数据3移到下标0的位置,把下标0的数据6移到下标3的位置,完成第一次比较:
下标
|
0
|
1
|
2
| 3 |
4
|
5
|
数据
|
3
|
2
|
7
|
6
|
8
|
9
|
i=0 j=3 k=6
第二次比较
从i开始向后搜索,即由前(左)开始向后(右)搜索(i++),找到第一个大于k的i,将i和j下标的值互换;
第二次比较,要变成找比k大的了,而且要从前往后找,递加变量i,发现下标2的数据是第一个比k大的,于是用下标2的数据7和j指向的下标3的数据6做交换,数据状态变成下表:
下标
|
0
|
1
|
2
|
3
|
4
|
5
|
数据
|
3
|
2
|
6
|
7
|
8
|
9
|
i=2 j=3 k=6
接着,不断重复进行上面的循环比较,直到数组不能再分解为止(只有一个数据)
以下是实现快速排序的java代码
public static void quickSort(int[] array, int min, int max) {
//定义第一个数和最后一个数
int start = min;
int end = max;
//定义基准值
int key = array[min];
//循环比较
while (end > start) {
// 从后面开始开始找比基准值小的数
while (end > start && array[end] >= key) {
// 如果没有比关键值小的,比较下一个,直到有比基准值小的就交换位置,然后又从前往后开始比较
end--;
}
//值的交换
if (array[end] <= key) {
int index = array[end];
array[end] = array[start];
array[start] = index;
}
// 从前面开始找比基准值大的数
while (end > start && array[start] <= key) {
//如果没有比关键值大的,比较下一个,直到有比关键值大的就交换位置
start++;
}
//值的交换
if (array[start] >= key) {
int index = array[start];
array[start] = array[end];
array[end] = index;
}
}
//递归
if (start > min) {
//左边序列。第一个索引位置到基准值的索引-1
quickSort(array, min, start - 1);
}
if (end < max) {
//右边序列。从基准值的索引+1到最后一个
quickSort(array, end + 1, max);
}
}
//给数组赋值并输出
public static void main(String[] args) {
int[] array = { 23,53,77,36,84,76,93,13,45,23 };
quickSort(array, 0, array.length - 1);
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
}