算法学习7-桶排序的例题=> 相邻两数最大

算法学习-桶排序的具体例题<高频题目>相邻两数最大插值

问题描述:
给定一个数组,求排序之后的最大差值,且时间复杂度为O(N),额外空间复杂度为O(1)的算法,且要求不能用非比较的排序算法。

问题分析 && 算法实现

  1. 将待排序元素划分到不同的桶。先扫描一遍序列求出最大值 maxV 和最小值 minV ,设桶的个数为 k ,则把区间 [minV, maxV] 均匀划分成 k +1个区间,每个区间就是一个桶。将序列中的元素分配到各自的桶。
    2.根据鸽笼原理(鸽笼原理简单表述:若有n个笼子和n+1只鸽子,所有的鸽子都被关在鸽笼里,那么至少有一个笼子有至少2只鸽子。推广:如果要把n个物件分配到m个容器中,必有至少一个容器容纳至少⌈n / m⌉个物件。(⌈x⌉大于等于x的最小的整数))可以得知至少有一个空桶(空桶的意义在于否定最大插值在同一个桶中出现),
    3.去遍历一遍数组,去记录每个桶中的最大值和最小值及每个桶是否是空桶.
    4.去找相邻两个桶的最大差值(及后一个桶的最小值和相邻的前一个非空桶的最大值)
    5.最后结果即在这些记录的最大值中.即找出这些跨桶最大值中的最大值.

代码实现:

#include<iostream>
#include<cstdlib>
using namespace std; 

//求出每一个数所在的桶的编号
int bocketNum(int a[], int i, int min, int max, int len){
   
	return (a[i]-min) * len / (max-min);
}
int Min(int a, int b){
   
	return a <= b ? a : b;
}
int Max(int a, int b){
   
	r
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值