桶排序

算法描述

代码演示

public static int[] findNearestNumber(int[] numbers){
	
	//1.从后向前查看逆序区域,找到逆序区域的前一位,也就是数字置换的边界
	int index=findTransferPoint(numbers);
	//如果数字置换边界是0,说明整个数组已经逆序,无法得到更大的相同数
	//字组成的整数,返回null
	if(index==0){
		return null;
	}
	//2.把逆序区域的前一位和逆序区域中刚刚大于它的数字交换位置
	//复制并入参,避免直接修改入参
	int[] numbersCopy=Arrays.copyOf(numbers,numbers.lengexchangeHead(numbersCopy,index);
	//3.把原来的逆序区域转为顺序
	reverse(numbersCopy,index);
	return numbersCopy;
}

private static int findTransferPoint(int[] numbers){
	for(int i=numbers.length-1;i>0;i--){
		if(numbers[i]>numbers[i-1]){
			return i;
		}
	}
	return 0;
}

private static int[] exchangeHead(int[] numbers,int index){
	int head=numbers[index-1];
	for(int i=numbers.length-1;i>0;i--){
		if(head<numbers[i]){
			numbers[index-1]=numbers[i];
			numbers[i]=head;
			break;
		}
	}
	return numbers;
}
private static int[] reverse(int[] num,int index){
	for(int i=index,j=num.length-1;i<j;i++,j--){
		int temp=num[i];
		num[i]=num[j];
		num[j]=temp;
	}
	return num;
}

复杂度分析

桶排序最好情况下使用线性时间O(n),桶排序的时间复杂度,取决与对各个桶之间数据进行排序的时间复杂度,因为其它部分的时间复杂度都为O(n)。很显然,桶划分的越小,各个桶之间的数据越少,排序所用的时间也会越少。但相应的空间消耗就会增大。

时间复杂度

  • 最佳情况:T(n) = O(n+k)
  • 最差情况:T(n) = O(n+k)
  • 平均情况:T(n) = O(n2)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值