根排序

package com.victor.sort.algorithms;

import java.util.ArrayList;

import com.victor.sort.seeds.FewUniqueKeys;
import com.victor.sort.seeds.NearSorted;
import com.victor.sort.seeds.Random;
import com.victor.sort.seeds.Reversed;
import com.victor.sort.seeds.Seeds;

/**
 * 根排序
 * @author 黑妹妹牙膏
 *
 */
public class Radix extends SortAlgorithms {

	/**
	 * (non-Javadoc)
	 * @see com.victor.sort.algorithms.SortAlgorithms#_sort(java.util.ArrayList)
	 	A: array d: The number of the highest digits
	 	RADIX-SORT(A,d)
	 		for i<- i to d
	 			do use a stable sort to sort array A on digit i
	 */
	
	@SuppressWarnings("unchecked")
	@Override
	protected ArrayList<Integer> doSort(ArrayList<Integer> Alist) {
		ArrayList<Integer> a = (ArrayList<Integer>)Alist.clone();
		for(int i=(a.size()-1)/2;i>=0;i--)
		{
			a = sink(a,i,a.size());
		}
		int max = a.get(0);
		int d = (max+"").length();

		for(int i=1;i<=d;i++)
		{
			a = _Insertion(a,i);
		}
		return a;
	}
	
	protected ArrayList<Integer> _Insertion(ArrayList<Integer> Alist,int i) {
		ArrayList<Integer> a = Alist;
		int n = a.size();
		int k;
		for(int j=1;j<n;j++)
		{
			int temp = a.get(j);
			for(k=j;k>0 && getRadix(temp,i)<getRadix(a.get(k - 1),i);k--)
			{
				a.set(k, a.get(k-1));       
			}
			a.set(k,temp);
			moveMentIncrease();
		}
		return a;
	}
	
	private int getRadix(int value,int i)
	{
		int length = (value+"").length();
		if(length<i) return 0;
		return Integer.parseInt((value+"").substring(length-i, length-i+1));
	}
	
	private ArrayList<Integer> sink(ArrayList<Integer> a,int i,int n)
	{
		//get left child
		int lc = 2 * i + 1;
		if(lc >= n) return a;
		//get right child
		int rc = lc + 1;
		//get max of left and right child
		int mc = (rc >= n) ? lc : (a.get(lc) > a.get(rc) ? lc : rc);
		// if parent > max of child then return
		if(a.get(i) >= a.get(mc)) return a;
		//swap max and parent
		int temp = a.get(i);
		a.set(i, a.get(mc));
		a.set(mc, temp);
		moveMentIncrease();
		return sink(a,mc,n);
	}

	@Override
	public String getName() {
		return "Radix";
	}
	
	public static void main(String[] args)
	{
		Seeds seed1 = new Random();
		Seeds seed2 = new NearSorted();
		Seeds seed3 = new Reversed();
		Seeds seed4 = new FewUniqueKeys();
		SortAlgorithms SA = new Radix();
		SA.sort(seed1,10000);
//		SA.print();
		SA.sort(seed2,10000);
		SA.sort(seed3,10000);
		SA.sort(seed4,10000);
	}

}


转载于:https://my.oschina.net/readjava/blog/304444

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值