zoukankan      html  css  js  c++  java
  • 排序_快速排序_另一种取划分点的方法

    最基本的划分点由数组的最后一个值来确定,现在是将数组的最后一个值的前一个数值作为划分点,但是需要经过三项取一方法的变换,最后它位置上的值是三个中最大的。

    public class ArrayIns {
        private long [] a;
        private int nElems;
        public ArrayIns(int maxSize) {
            a=new long[maxSize];
            nElems=0;
        }
        public void insert(long value) {
            a[nElems]=value;
            nElems++;
        }
        public int size() {
            return nElems;
        }
        public void display() {
            for(int j=0;j<nElems;j++) {
                System.out.print(a[j]+" ");
            }
            System.out.println();
        }
        public void quickSort() {
            recQuickSort(0, nElems-1);
        }
        //递归方法
        public void recQuickSort(int left,int right) {
            int size=right-left+1;
            //这个可以进行改进
            if(size<=3) {
                //剩下三个,就手工判断
                manualSort(left,right);
            }else{
                long median=medianOf3(left,right);
                //pivot可以进行改进
                long pivot=median;
                int partition=partitionIt(left, right, pivot);  //由划分方法return得到
                recQuickSort(left, partition-1);//前部分再划分
                recQuickSort(partition, right);//后部分再划分
            }
        }
        private long medianOf3(int left, int right) {
            //三项数据取中间大小的值作为划分点
            int center=(left+right)/2;
            if(a[left]>a[center])
                swap(left, center);
            if(a[left]>right)
                swap(left, right);
            if(a[center]>a[right])
                swap(center, right);
            swap(center, right-1);
            return a[right-1];
        }
        private void manualSort(int left, int right) {
            int size=right-left+1;
            //判断当前需要划分的数组的大小
            if(size<1)
                return;
            if(size==2) {
                if(a[left]>a[right]) {
                    swap(left, right);
                    return ;
                }            
            }else {
                if(a[left]>a[right-1])swap(left, right-1);
                if(a[left]>a[right])swap(left, right);
                if(a[right-1]>a[right])swap(right-1, right);
            }
            
        }
        public int partitionIt(int left,int right,long pivot) {
            int leftPtr=left;
            int rightPtr=right-1;
            while(true) {
                //左边找大于特定值的
                while( a[++leftPtr]<pivot);
                //右边找小于特定值的
                while(a[--rightPtr]>pivot);
                if(leftPtr>=rightPtr)
                    break;
                else
                    //交换指向的值
                    swap(leftPtr, rightPtr);
            }
            swap(leftPtr, right-1);
            return leftPtr;
            
        }
        public void swap(int dex1,int dex2) {
            long temp;
            temp=a[dex1];
            a[dex1]=a[dex2];
            a[dex2]=temp;
        }
    
    }
    public class Test {
    
        public static void main(String[] args) {
            int maxSize=100;
            ArrayIns arrayPar=new ArrayIns(maxSize);
            arrayPar.insert(60);
            arrayPar.insert(30);
            
            arrayPar.insert(80);
            arrayPar.insert(10);
            arrayPar.insert(70);
            arrayPar.insert(90);
            arrayPar.insert(00);
            arrayPar.insert(20);
            arrayPar.insert(40);
            arrayPar.display();
            arrayPar.quickSort();
            arrayPar.display();
    
        }
    
    }
  • 相关阅读:
    js根据年份获取某月份有几天
    java 时间转换去杠
    简单Maven Dos命令语句
    Maven命令参数
    Redis学习推荐
    Java中Redis缓存
    oracle新建登录用户sql语句
    ORacle修改表列长度
    jsp利用application统计在线人数的方法
    Oracle之分页查询
  • 原文地址:https://www.cnblogs.com/S-Mustard/p/8097472.html
Copyright © 2011-2022 走看看