题目描述:给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度O(N),且要求不能用非基于比较的排序。
思想:基于桶排序的基本思想。
分成n+1个桶,首先找出最小和最大值分别放在第一个桶和最后一个桶,剩下的n-1个桶按照数组的最大和最小值平均分。当数组元素大于2时,排序之后的相邻元素的最大差值肯定不是存在于同一个桶内,因此只需存储每个桶内的最大和最小值,以及该桶内是否有元素(1表示有,0表示没有),从而遍历多个桶,求后一个桶最小值与前一个桶最大值之间的差值,返回最大的那个,即为最终所求的结果。此时时间复杂度为O(n),且不是基于比较的排序。
/*
给定一个数组,求如果排序之后,相邻两数的最大差值,
要求时 间复杂度O(N),且要求不能用非基于比较的排序
*/
#include<iostream>
#include<math.h>
#include<algorithm>
#include<windows.h>
#include<vector>
#include<time.h>
#include<malloc.h>
using namespace std;
int maxGap(int *nums);
int bucket(long num, long len, long min, long max);
int comparator(int *nums);
int *generateRandomArray(int maxSize, int maxValue);
int *copyArray(int *arr);
void printArray(int *arr);
//要求时间复杂度O(N),且非基于比较的排序。
int maxGap(int *nums){
int length = _msize(nums) / sizeof(int);
if (nums == NULL || length < 2) {
//如果数组为空或长度小于2,则返回0