黑马程序员技术交流社区

标题: 一种快速排序的算法 [打印本页]

作者: HAnG    时间: 2013-11-26 21:36
标题: 一种快速排序的算法
本帖最后由 HAnG 于 2013-11-26 21:44 编辑

是从大话数据结构这本书里学习到的算法,书上是用C语言写的,我自己用java实现了一下,加了不少注释。快排的的基本思想是:通过一趟排序将待排的记录划分为独立的两部分,其中一部分记录的关键字均不大于另一部分记录的关键字,然后再分别对这两部分记录继续进行快速排序,以达到整体有序。
  1. public class SortTest {

  2.         public static void main(String[] args) {
  3.                 int[] arr = {52,18,94,36,72,48,88,65,20};
  4.                
  5.                 printArray(arr);   
  6.                 Sort.quickSort(arr);
  7.                 printArray(arr);     
  8.         }
  9.       
  10.         public static void printArray(int[] arr) {
  11.                 System.out.print("[");
  12.                 for(int x = 0; x < arr.length-1; x++) {
  13.                         System.out.print(arr[x] + ",");
  14.                 }
  15.                 System.out.println(arr[arr.length-1] + "]");
  16.         }

  17. }

  18. class Sort {
  19.         //对整个数组进行快速排序
  20.         public static void quickSort(int[] arr) {               
  21.                 quickSort(arr, 0, arr.length-1);
  22.         }
  23.         
  24.         //对数组[left...right]进行快速排序
  25.         public static void quickSort(int[] arr, int left, int right) {
  26.                 int pivot;
  27.                 if(left < right) {      //若调用者传入的参数左指针比右指针大则不进行排序
  28.                         pivot = getPivot(arr, left, right);  //调用getPivot方法获取分割高低两个数组的枢轴
  29.                         quickSort(arr, left, pivot - 1);     //对低子数组进行递归快速排序
  30.                         quickSort(arr, pivot + 1, right);         //对高子数组进行递归快速排序
  31.                 }

  32.         }

  33.         private static int getPivot(int[] arr, int left, int right) {
  34.                 //定义枢轴关键字为left所指的关键字
  35.                 int pivotkey = arr[left];     
  36.                 //当left和right不重合时执行循环
  37.                 while(left < right) {         
  38.                         //right向左搜索,然后交换左关键字和右关键字。
  39.                         while(left < right && arr[right] >= pivotkey)
  40.                                 right --;
  41.                         swap(arr, left, right);
  42.                         //right搜索完,left向右搜索,然后交换左右关键字。
  43.                         while(left < right && arr[left] <= pivotkey)
  44.                                 left ++;
  45.                         swap(arr, left, right);
  46.                 }
  47.                 //left和right重合时,返回一个新的枢轴
  48.                 return left;
  49.                
  50.         }
  51.         private static void swap(int[] arr, int n1, int n2) {
  52.                 int temp = arr[n1];
  53.                 arr[n1] = arr[n2];
  54.                 arr[n2] = temp;
  55.         }        
  56. }
复制代码



作者: 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