快速排序思想:
快速排序算法是对冒泡排序的一种改进,它采用了一种分治的策略,通常称其为分治法。分治法的思想是:将原问题分解为若干个规模更小的但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。
即通过一趟排序将进行排序的数据分割成独立的两部分,其中一部分的数据比另一部分的数据都大,然后再按此访求对这两部分数据分别进行快速排序,这样循环往复,直到进行排序的数据按一定的顺序排列。
快速排序过程图示如下:
快速排序的步骤:
1.分解:
在数组arr[low...high]中任意选取一个元素作为参考值(通常选取第一个作为参考值)与其他元素进行大小比较,以此为基准将当前无序的数组分为左右两个较小的子区间,左边的元素都小于或者等于它,右边的元素都大于它。然后求取这个参考值在这次排序之后在这个数组中的位置的值。
2.求解:
通过上面获得的参考值的位置把原数组分解成两个不同的数组(即把上面获取的左右两个不同的区间放入两个不同的数组),然后再递归调用快速排序分别对这两个数组进行排序。
3.组合:
由于是在同一个数组中分解成不同的区间,而不是真的把原数组分解成多个数组,多个区间调用快速排序还是在原数组中进行,因此组合这一步是一个空操作。
快速排序算法的核心方法(为了便于说明,数组以整型数组为例):
1.快速排序的方法
public void quickSort(int arr[], int low, int high) {
int point; //每次排序之后返回的分界点
if (low < high) { //直到low==high为止
point = point(arr, low, high); //上次快速排序获取到的键值的位置,依此把原数组分为左右两个区间
quickSort(arr, low, point - 1); //左区间
quickSort(arr, point + 1, high); //右区间
}
}
2.获取分界点的方法
public int point(int arr[], int i, int j) {
int key = arr[i]; //指定一个键值来作为每次排序的比较值,每次排序之后让大于它的数放在后面,让小于它的数放在前面
while (i < j) { //如果i
}
if (i < j) { //如果进行上面的操作之后,键值大于arr[j],但是仍然是i
}
while (i < j && key >= arr[i]) { //如果i
}
if (i < j) { //如果进行上面的操作之后,键值小于arr[i],但是仍然是i
}
}
arr[i] = key;
return i;
}
举例说明如下:
public class QuickSort {
public static void main(String args[]) {
int[] a = {5, 4, 8, 2, 7};
QuickSort qs = new QuickSort();
qs.quickSort(a, 0, a.length - 1);
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
System.out.println();
}
public void quickSort(int arr[], int low, int high) {
int point; //每次排序之后返回的分界点
if (low < high) {
point = point(arr, low, high);
quickSort(arr, low, point - 1);
quickSort(arr, point + 1, high);
}
}
public int point(int arr[], int i, int j) {
int key = arr[i]; //指定一个键值来作为每次排序的比较值,每次排序之后让大于它的数放在后面,让小于它的数放在前面
while (i < j) { //如果i
}
if (i < j) { //如果进行上面的操作之后,键值大于arr[j],但是仍然是i
}
while (i < j && key >= arr[i]) { //如果i
}
if (i < j) { //如果进行上面的操作之后,键值小于arr[i],但是仍然是i
}
}
arr[i] = key;
return i;
}
}
快速排序演示