黑马程序员技术交流社区
标题:
一种快速排序的算法
[打印本页]
作者:
HAnG
时间:
2013-11-26 21:36
标题:
一种快速排序的算法
本帖最后由 HAnG 于 2013-11-26 21:44 编辑
是从大话数据结构这本书里学习到的算法,书上是用C语言写的,我自己用java实现了一下,加了不少注释。快排的的基本思想是:通过一趟排序将待排的记录划分为独立的两部分,其中一部分记录的关键字均不大于另一部分记录的关键字,然后再分别对这两部分记录继续进行快速排序,以达到整体有序。
public class SortTest {
public static void main(String[] args) {
int[] arr = {52,18,94,36,72,48,88,65,20};
printArray(arr);
Sort.quickSort(arr);
printArray(arr);
}
public static void printArray(int[] arr) {
System.out.print("[");
for(int x = 0; x < arr.length-1; x++) {
System.out.print(arr[x] + ",");
}
System.out.println(arr[arr.length-1] + "]");
}
}
class Sort {
//对整个数组进行快速排序
public static void quickSort(int[] arr) {
quickSort(arr, 0, arr.length-1);
}
//对数组[left...right]进行快速排序
public static void quickSort(int[] arr, int left, int right) {
int pivot;
if(left < right) { //若调用者传入的参数左指针比右指针大则不进行排序
pivot = getPivot(arr, left, right); //调用getPivot方法获取分割高低两个数组的枢轴
quickSort(arr, left, pivot - 1); //对低子数组进行递归快速排序
quickSort(arr, pivot + 1, right); //对高子数组进行递归快速排序
}
}
private static int getPivot(int[] arr, int left, int right) {
//定义枢轴关键字为left所指的关键字
int pivotkey = arr[left];
//当left和right不重合时执行循环
while(left < right) {
//right向左搜索,然后交换左关键字和右关键字。
while(left < right && arr[right] >= pivotkey)
right --;
swap(arr, left, right);
//right搜索完,left向右搜索,然后交换左右关键字。
while(left < right && arr[left] <= pivotkey)
left ++;
swap(arr, left, right);
}
//left和right重合时,返回一个新的枢轴
return left;
}
private static void swap(int[] arr, int n1, int n2) {
int temp = arr[n1];
arr[n1] = arr[n2];
arr[n2] = temp;
}
}
复制代码
作者:
121676463
时间:
2013-11-27 00:41
这个是传说中的二分排序?
作者:
HAnG
时间:
2013-11-27 01:21
121676463 发表于 2013-11-27 00:41
这个是传说中的二分排序?
就叫快速排序,quickSort,类库里的sort方法用的就是它,不过源码写得很牛逼,用了一大堆常量来分治。目前表示看不懂。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2