基数排序详解

排序原理:
   基数排序是一种非比较型排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。
排序思想:
   数位来进行排序的.他是从个位开始,然后按照每一位的数进行排序
排序过程:
1.先按照个位进行排序
在这里插入图片描述
2.接着按照十位排序
在这里插入图片描述
3.重复这个过程,直到所有的位数已经被排过序了,并且如果这个过程中碰到在某个位上没有数的话就进行补零操作
在这里插入图片描述
实现步骤:
1.我们第一次遍历序列.找出序列中的最大值MAX,找到MAX之后我们可以确定我们需要比较多少数位了.
2.这时候我们就需要按照元素在该位数对应的数字将元素存入到相应的容器之中.如下图所示:
在这里插入图片描述
3.之后我们再按照容器的顺序将元素重新弹出构成我们接下来需要排序的序列,如下图所示:
在这里插入图片描述
这个从容器弹出的过程需要注意一点,那就是遵循先进先出的原则,所以这个容器选择队列或者是链表比较合适,不能选择栈,因为栈是先进后出,拿取元素的时候回非常麻烦.
4.最后只需要重复2,3步骤,直到最高位也比较完毕,那么整个基数排序就已经完成了.
动图演示
在这里插入图片描述
代码展示

//将所有的数组合并成原来的数组
	public static void merge(ArrayList<Integer> list[],int num[]) {
		int k=0;
		for(int i=0;i<list.length;i++) {
			if(list[i]!=null) {
				for(int j=0;j<list[i].size();j++) {
					num[k++]=list[i].get(j);
					System.out.print(num[k-1]+" ");
				}
			}
			//合并完成之后需要将链表清空,否则元素会越来越多
			list[i].clear();
		}
		System.out.println();
	}
	//将所有的元素分散到各个链表之中
	public static void split(ArrayList<Integer> list[],int num[],int k) {
		for(int j=0;j<num.length;j++) {
			list[num[j]/k%10].add(num[j]);
		}
		System.out.println("-----------------------------------------------------------------------");
		System.out.println("个位开始数,第"+(String.valueOf(k).length())+"位排序结果:");
		for(int j=0;j<10;j++) {
			System.out.println((String.valueOf(k).length())+"号位,数值为"+j+"的链表结果:"+list[j]);
		}
	}
	public static void main(String[] args) {
		ArrayList<Integer>list[]=new ArrayList [10];
		for(int i=0;i<10;i++) {
			list[i]=new ArrayList<Integer>();
		}
		int []num ={7,14,9,333,201,1,88,6,57,10,56,74,36,234,456};
		long startTime=System.currentTimeMillis();  
		int max=Integer.MIN_VALUE;
		//第一次遍历获得序列中的最大值
		for(int i=0;i<num.length;i++) {
			if(num[i]>max)
				max=num[i];
		}
		int k=1;
		for(int i=0;i<String.valueOf(max).length();i++) {
			split(list, num, k);
			System.out.println("第"+(i+1)+"次排序");
			merge(list, num);
			k=k*10;
		}     
	}

性能分析
稳定性:
稳定
时间复杂度
基数排序只需要根据最大元素的位数,遍历相应次数的序列即可,所以我们可以确定基数排序的时间复杂度一定是线性级别的,但是虽然是线性级别的,但是有一个系数的,这个系数就是最大元素的位数K,所以时间复杂度应该是O(n*k)
空间复杂度
空间复杂度主要就是取决于链表的数量以及序列元素的数量,所以空间复杂度为O(n+k)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中,对象数组可以使用`Arrays.sort()`方法进行排序。`Arrays.sort()`方法有多种重载形式,可以根据不同的比较器进行排序,例如: ```java public static <T> void sort(T[] a, Comparator<? super T> c) ``` 其中,`a`参数是待排序的对象数组,`c`参数是比较器,用于指定排序的规则。 比较器是一个接口,通常使用Java 8中的lambda表达式来实现。比较器应该返回一个整数值,表示两个对象的大小关系。如果返回值小于0,则表示第一个对象小于第二个对象;如果返回值等于0,则表示两个对象相等;如果返回值大于0,则表示第一个对象大于第二个对象。 下面是一个示例,演示如何使用`Arrays.sort()`方法对对象数组进行排序: ```java class Person { String name; int age; public Person(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } } public class ObjectArraySortDemo { public static void main(String[] args) { Person[] persons = { new Person("Alice", 25), new Person("Bob", 30), new Person("Charlie", 20) }; // 按年龄升序排序 Arrays.sort(persons, Comparator.comparingInt(person -> person.age)); // 输出排序后的结果 System.out.println(Arrays.toString(persons)); } } ``` 输出结果为: ``` [Person{name='Charlie', age=20}, Person{name='Alice', age=25}, Person{name='Bob', age=30}] ``` 在上面的示例中,我们创建了一个`Person`类,并创建了一个包含三个`Person`对象的数组。然后我们使用`Arrays.sort()`方法对数组进行排序,排序的依据是`Person`对象的`age`属性,使用了`Comparator.comparingInt()`方法来指定按照`age`属性进行排序。最后,我们输出排序后的结果。 除了上面的示例中使用的`Comparator.comparingInt()`方法,还有其他的比较器可以使用,例如: - `Comparator.comparing()`:使用对象的某个属性进行排序; - `Comparator.reverseOrder()`:逆序排列; - `Comparator.naturalOrder()`:自然排序,用于实现`Comparable`接口的类; - 自定义比较器,实现`Comparator`接口的`compare()`方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值