2013.12.15

* 实现了基于插入排序&“三项取中”划分的快速排序;

* “三项取中”划分带来的好处:

    1:一定程度上避免了基本有序源数组导致的快速排序性能劣化的情况;

    2: low,center,high三个元素已经排好,故不用将low,high加入循环,一定程度上减少了比较次数;

    3: 消除了循环内l<h的判断,因为不会出现一直low++/high--而出现的越界情况;

* 使用“三项取中”划分的快速排序不能处理只有2/3个元素的数组,并且对多数据排序的时候,小划分(~=3)要使用手动排序;

* 快速排序的效率 N*logN;

* 基数排序实际上的效率与快速排序相近都是N*logN,但是需要两倍于快速排序的空间;

* 实现了基于链表的基数排序。此排序中使用的栈有deleteFirst(),insertFirst()方法,较大的数后进入站,正向遍历栈组中的所有数据,会导致大数先出栈,所以应该反向遍历栈组并从后插入数组;

* 实现了基于pivot的中位数查找;

基于“三项取中”划分&小划分(9)插入排序的快速排序算法@java/DataStructure/unit7

import java.util.*;

public class TestQuickSort2{
        public static void main(String [] args){
                Random rand=new Random(47);
                int [] iArr=new int [100];
                for(int i=0; i<100; i++) iArr[i]=rand.nextInt(100);
                System.out.println(Arrays.toString(iArr));
                quickSort(0, iArr.length-1, iArr);
                System.out.println(Arrays.toString(iArr));
        }

        public static int partition(int low, int high, int [] iArr){
                int l=low+1, h=high-1, c=(low+high)/2, pivot=c, t;
                if(iArr[low]>iArr[c]){t=iArr[low]; iArr[low]=iArr[c]; iArr[c]=t;}
                if(iArr[c]>iArr[high]){t=iArr[c]; iArr[c]=iArr[high]; iArr[high]=t;}
                while(l<h){
                        while(iArr[h]>pivot){
                                h--;
                        }
                        iArr[l]=iArr[h];
                        while(iArr[l]<=pivot){
                                l++;
                        }
                        iArr[h]=iArr[l];
                }
                iArr[l]=pivot;
                return l;
        }

        public static void insertSort(int low, int high, int [] iArr){
                int t, j;
                for(int i=low+1; i<=high; i++){
                        if(iArr[i]<iArr[i-1]){
                                t=iArr[i];
                                j=i-1;
                                for(; j>=0 && t<iArr[j]; j--) iArr[j+1]=iArr[j];
                                iArr[j+1]=t;
                        }
                }
        }

        public static void quickSort(int low, int high, int [] iArr){
                int size=high-low+1;
                if(size<10) insertSort(low, high, iArr);
                else{
                        int ptr=partition(low, high, iArr);
                        quickSort(low, ptr-1, iArr);
                        quickSort(ptr+1, high, iArr);
                }
        }
}

基于链表的基数排序@java/DataStructure/unit7

import java.util.*;

public class TestRadixSort{
        public static void main(String [] args){
                Random rand=new Random(47);
                int [] iArr=new int [100];
                for(int i=0; i<iArr.length; i++) iArr[i]=rand.nextInt(1000);
                System.out.println(Arrays.toString(iArr));
                radixSort(iArr, 3);
                System.out.println(Arrays.toString(iArr));
        }
        
        public static void radixSort(int [] iArr, int digit){
                int l=iArr.length, t=1;
                int [] tArr=new int [iArr.length];
                LinkListX [] lArr=new LinkListX[10];
                for(int i=0; i<10; i++) lArr[i]=new LinkListX();
                for(int i=0; i<digit; i++){
                        for(int j=0; j<l; j++){
                                if(iArr[j]<t) lArr[0].insertFirst(iArr[j]);
                                else lArr[(iArr[j]/t)%10].insertFirst(iArr[j]);
                        }
                        int k=l-1;
                        for(int j=9; j>=0; j--){
                                while(!lArr[j].isEmpty()){
                                        iArr[k--]=lArr[j].deleteFirst().iData;
                                }
                        }
                        t*=10;
                }
        }
}
基于pivot的中位数查找@java/DataStructure/unit7

import java.util.*;

public class TestCenterValue{
        public static void main(String [] args){
                Random rand=new Random(47);
                int [] iArr= new int [11];
                for(int i=0; i<11; i++) iArr[i]=rand.nextInt(100);
                System.out.println(Arrays.toString(iArr));
                findCenterValue(0, iArr.length-1, iArr);
        }

        public static int patition(int low, int high, int [] iArr){
                int l=low, h=high, pivot=iArr[low];
                while(l<h){
                        while(l<h && iArr[h]>pivot){
                                h--;
                        }
                        iArr[l]=iArr[h];
                        while(l<h && iArr[l]<=pivot){
                                l++;
                        }
                        iArr[h]=iArr[l];
                }
                iArr[l]=pivot;
                return l;
        }

        public static void findCenterValue(int low, int high, int [] iArr){
                int p=patition(low, high, iArr);
                if(iArr.length/2==p){System.out.println("The Center Value is "+iArr[p]); return;}
                else if(p>iArr.length) findCenterValue(low, p-1, iArr);
                else findCenterValue(p+1, high, iArr);
        }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值