题目描述
今天来用Java实现一下快速排序算法,首先了解一下快速排序
基本思想
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
算法解析
1、选择一个基准元素,通常选择第一个元素或者最后一个元素
2、通过一趟排序将待排序的记录分割成独立的两部分,其中一部分记录的元素值均比基准元素值小。另一部分记录的元素值均比基准值大
3、通过一趟排序,基准元素就在其排好序后的正确位置上了
4、然后分别对这两部分记录用同样的方法继续进行排序,直到整个序列有序
PS:下述动图引用自网上,侵删!
然后来了解一下递归方法的使用:
1、递归算法有一个出口
2、递归时候每次做的事情都一样
举个典型的例子:n!=n*(n-1)!,出口是1!=1,每次递归都调用(n-1)!
题解:
public class quickSort {
/**
* 快排算法(以数组中最后一个值作为基准)
*/
public static int[] algo(int[] arr, int low, int high) {
//定义四个指针,low和high用来做目前快排数组中哪部分数的标记,left和right用来做目前与基准值比较的元素的定位
int left = low;
int right = high;
//只要left和right两个指针没有相遇,就说明一轮比较没有完成
while (left < right) {
//基准值为最右侧元素
int base = arr[right];
//从最左侧元素开始与基准值做比较
while (left < right) {
//若左侧元素比基准值小,指针向右移一步,表示进行下一个元素的比较
if (arr[left] <= base) {
left += 1;
} else {
//若左侧元素比基准值大,该元素与基准值进行交换,然后右指针向左移一步,同时退出该左侧元素比较的循环,进入右侧元素比较
arr[right] = arr[left];
arr[left] = base;
right -= 1;
break;
}
}
//右侧比较原理同上,不再做赘述
while (left < right) {
if (arr[right] >= base) {
right -= 1;
} else {
arr[left] = arr[right];
arr[right] = base;
left += 1;
break;
}
}
//通过一趟排序正确放置好基准元素的位置,左侧元素值均比基准元素值小,右侧元素值均比基准值大
//对左侧序列进行快排
algo(arr, low, left - 1);
//对右侧序列进行快排
algo(arr, right + 1, high);
}
return arr;
}
public static void main(String[] args) {
int[] nums = { 3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48 };
int[] result = algo(nums, 0, nums.length-1);
for (int i : result) {
System.out.print(i+" ");
}
}
}
说明:
目前本King的代码能力只能按上述方式实现,后续有更好的方案,欢迎各位指点,也会不定期做修改~