快速排序!

自从用了java排序基本上就是E.sort().. 今天需要自己实现一下排序, 居然费了半天劲.. 郁闷, 基础真的不扎实啊.. 写了个简单的数组快速排序总结复习一下, 随便贴上来得了. 希望过路的朋友指正.

另外, wikipedia介绍qicksort的条目还是比较详细的.
http://zh.wikipedia.org/w/index.php?title=快速排序&variant=zh-tw

快速排序是典型的使用分治策略的一种交换排序.

一次排序步骤:
得到中心点作为关键点(其他的得到关键点的方法要根据排序数组来决定, 由于关键点是用来比较的基准所以如果基准选择得当可以减少交换的次数, 从而提高算法效率 , 是比较有技巧的部分), 以该关键点元素作为基准, 从数组两头分别与之比较, 大的放右边,小的放左边,相等的无论哪边都成(干脆不动). 最后当遍历完数组一遍(即两头的标志指向同一个数组元素)时把关键点元素放到该位置(此时确定这里为分治点 ),完成一次排序.

对关键点左右两个子序列递归调用, 以子序列小于两个元素为退出递归条件. 完成整个数组的排序.

Java代码
复制代码
  1. public class Quicksort {   
  2.   
  3.     private int getPivot(int begin, int end) {   
  4.   
  5.         return (begin + end) >> 1;   
  6.     }   
  7.   
  8.     // 一次排序   
  9.     private int partition(int[] array, int begin, int end) {   
  10.         int pivot = getPivot(begin, end);   
  11.         int tmp = array[pivot];   
  12.         array[pivot] = array[end];   
  13.         while (begin != end) {   
  14.             while (array[begin] < tmp && begin < end)   
  15.                 begin++;   
  16.             if (/* array[begin] > tmp && */begin < end) {   
  17.                 array[end] = array[begin];   
  18.                 end--;   
  19.             }   
  20.             while (array[end] > tmp && end > begin)   
  21.                 end--;   
  22.             if (/* array[end] < tmp && */end > begin) {   
  23.                 array[begin] = array[end];   
  24.                 begin++;   
  25.             }   
  26.         }   
  27.         // 此时两个下标指向同一个元素.以这个位置左右分治(分治点)   
  28.         array[begin] = tmp;   
  29.         return begin;   
  30.     }   
  31.   
  32.     private void qsort(int[] array, int begin, int end) {   
  33.   
  34.         if (end - begin < 1)   
  35.             return;   
  36.         int pivot = partition(array, begin, end);   
  37.         qsort(array, begin, pivot);   
  38.         qsort(array, pivot + 1, end);   
  39.     }   
  40.   
  41.     public void sort(int[] array) {   
  42.         qsort(array, 0, array.length - 1);   
  43.     }   
  44.   
  45.     public static void main(String[] args) {   
  46.         int[] array = { 322231451 };   
  47.         new Quicksort().sort(array);   
  48.         for (int i = 0; i < array.length; i++) {   
  49.             System.out.print(array[i] + ", ");   
  50.         }   
  51.     }   
  52. }  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值