码迷,mamicode.com
首页 > 编程语言 > 详细

快速排序(JAVA)

时间:2015-01-29 19:43:44      阅读:228      评论:0      收藏:0      [点我收藏+]

标签:

package org.rev.algorithm;

/**
 * 快速排序 算法复杂度Ο(n log n)
 * 
 * 1.挑出一个基准数据。
 * 
 * 2.给数列排序,大于基准数据的放在右边,小于基准数据的放在左边。
 * 
 * 3.递归地,对小于基准数据的子数列和大于基准数据的子数列排序。
 */
public class QuickSort {

  public static void main(String[] args) {
    int[] data = {39, 38, 55, 97, 86, 37, 12, 4, 11, 18};
    QuickSort qs = new QuickSort();
    qs.quick(data);
    for (int i = 0; i < data.length; i++) {
      System.out.print(data[i] + " ");
    }
    System.out.println();

  }


  public void quick(int[] data) {
    if (data.length > 0) { // length是0,就不能减1了。
      quickSort(data, 0, data.length - 1);
    }
  }

  /*
   * 递归地,对小于基准的数列和大于基准的数列排序。
   */
  private void quickSort(int[] data, int low, int high) {
    if (low < high) { // 如果没有这个判断,递归会无法退出,导致堆栈溢出异常。
      int middle = getMiddle(data, low, high); // 将数组一分为二。
      quickSort(data, low, middle - 1); // 对低端递归排序
      quickSort(data, middle + 1, high); // 对高端递归排序
    }
  }

  /*
   * 分治排序,所有比基准小的数据都放在基准的前面,比基准大的都放在基准的后面。
   * 
   * 如此,基准就处于数列靠中间的位置,并返回基准的位置。
   */
  private int getMiddle(int[] data, int low, int high) {
    int tmp = data[low]; // 以数组的第一个元素作为基准元素
    while (low < high) {
      while ((low < high) && (data[high] > tmp)) {
        high--;
      }
      data[low] = data[high]; // 比基准小的数据,移到低端。

      while ((low < high) && (data[low] < tmp)) {
        low++;
      }
      data[high] = data[low]; // 比基准大的数据,移到高端。
    }
    data[low] = tmp;
    return low;
  }

}


参考http://zh.wikipedia.org/wiki/%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F

快速排序(JAVA)

标签:

原文地址:http://my.oschina.net/xiaoxishan/blog/373334

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!