八大排序算法之基数排序

package com.zyg.sort;

public class RadixSortAlgorithm
{
	// 基数排序,len为数组长度,maxRadix为数组中数的最大位数
	public static void radixSort(int a[], int len, int maxRadix)
	{
		// 定义二维辅助数组
		int temp[][] = new int[10][len];
		// 当前排序的位数,初始状态为个位
		int partition = 1;
		// 依次从个位数到最高位排序
		for (int index = 0; index < maxRadix; index++)
		{
			for (int i = 0; i < len; i++)
			{
				// 根据排序位上的数字放入二维数组,数字取值为0-9
				int loc = (a[i] / partition) % 10;
				temp[loc][i] = a[i];
			}
			// 收集数组
			CollectElement(a, temp);
			// 排序位数左移
			partition = partition * 10;
		}
	}
	
	// 收集数组
	public static void CollectElement(int a[], int temp[][])
	{
		int index = 0;
		for (int i = 0; i < temp.length; i++)
		{
			for (int j = 0; j < temp[0].length; j++)
			{
				// 如果辅助数组中元素值大于零,将其加入数组
				if (temp[i][j] > 0)
					a[index++] = temp[i][j];
				// 重置辅助数组
				temp[i][j] = 0;
			}
		}
	}
	
	// 合并数组
	public static void mergeArray(int a[], int left[], int right[], int len)
	{
		int index = 0;
		// 负数数组还原,并进行倒转
		for (int i = left.length - 1; i >= 0; i--)
		{
			a[index] = -left[i];
			index++;
		}
		// 数组中零
		for (int i = 0; i < len - left.length - right.length; i++)
		{
			a[index] = 0;
			index++;
		}
		// 加入正数数组
		for (int i = 0; i < right.length; i++)
		{
			a[index] = right[i];
			index++;
		}
	}
	
	// 打印数组
	public static void printArray(int a[])
	{
		for (int i = 0; i < a.length; i++)
		{
			System.out.println(a[i]);
		}
	}
	
	public static void main(String[] args)
	{
		// 定义初始化数组
		int a[] =
		{ -4, 3, 6, 7, 33, 0, 90, 0, 777, 50 };
		// 数组长度
		int len = a.length;
		// 负数数组和正数数组
		int left[], right[];
		// 数组中负数和正数个数
		int negativeNum = 0, positiveNum = 0;
		for (int i = 0; i < len; i++)
		{
			if (a[i] < 0)
				negativeNum++;
			if (a[i] > 0)
				positiveNum++;
		}
		// 初始化负数数组和正数数组
		left = new int[negativeNum];
		right = new int[positiveNum];
		int j = 0, k = 0;
		for (int i = 0; i < len; i++)
		{
			// 负数数组赋值,并取其绝对值
			if (a[i] < 0)
			{
				left[j] = -a[i];
				j++;
			}
			// 正数数组
			if (a[i] > 0)
			{
				right[k] = a[i];
				k++;
			}
		}
		// 负数数组基数排序
		radixSort(left, left.length, 3);
		// 正数数组基数排序
		radixSort(right, right.length, 3);
		// 将数组进行合并
		mergeArray(a, left, right, len);
		// 打印数组
		printArray(a);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值