递归分治算法之随机快速排序(Java版本)

来源:互联网 发布:oa移动办公源码下载 编辑:程序博客网 时间:2024/05/04 18:21
/** * 递归分治算法学习之随机快速排序 * 采用随机选择枢纽元素的快速排序算法 * @author Sking */package 递归分治;import java.util.Random;public class randomizedQuickSortTest {/** * 采用随机选取枢纽元素策略的一次快排后的划分索引 * @param a 待排序数组 * @param p 区间左端 * @param r 区间右端 * @return 采用随机选取枢纽元素策略的一次快排后的划分索引 */@SuppressWarnings("rawtypes")private static int randomizedPartition(Comparable[] a,int p,int r){int i=random(p,r);swap(a,i,p);//将枢纽元素交换到区间最左端return partition(a,p,r);}/** * 采用随机选取枢纽元素策略的快速排序 * @param a 待排序数组 * @param p 指定区间的左端 * @param r 指定区间的右端 */@SuppressWarnings({ "unused", "rawtypes" })private  void randomizedQuickSort(Comparable[] a,int p,int r){if(p<r){int q=randomizedPartition(a,p,r);randomizedQuickSort(a,p,q-1);randomizedQuickSort(a,q+1,r);}}/** * 取i-j之间的一个随机数 * @param i 区间左端 * @param j 区间右端 * @return 指定区间间的一个随机数 */private static int random(int i,int j){Random r=new Random();return r.nextInt(j-i)+i;}/** * 求划分索引 * @param a 待排序数组 * @param p 区间左端 * @param r 区间右端 * @return 划分索引 */@SuppressWarnings({ "rawtypes", "unchecked" })private static int partition(Comparable[] a,int p,int r){int i=p,j=r+1;Comparable x=a[p];while(true){while(a[++i].compareTo(x)<0&&i<r);while(a[--j].compareTo(x)>0);if(i>=j)break;swap(a,i,j);}a[p]=a[j];a[j]=x;return j;}/** *  * @param a * @param i * @param j */    @SuppressWarnings("rawtypes")private  static void swap(Comparable[] a,int i,int j){Comparable temp=a[i];a[i]=a[j];a[j]=temp;}    public static void main(String[] args){        }}

原创粉丝点击