桶排序并判断不连续或重复

#include <memory>
#include <vector>
#include <iostream>

std: :vector<int> seq{1, 7, 3, 8, 6, 33, 18, 8, 8, 9999};

void sortGetAndset(std::vector<int> &output)
{
  //加写锁
  int max = 0;
  int min = 0;
  for (int i= 0; i != seq.size(); ++i)
  {
    if (i == 0)
	{
      max = min = seq[i];
	}
    if (seq[i] > max)
	{
      max = seq[i];
	}
    if (seq[i] < min)
	{
      min = seq[i];
    }
  }
  std::cout << "max:" << max << ",min:" << min << std::endl;
  int size = max - min + 1;
  std::unique_ptr<int []> arr(new int[size]());
  for (int i = 0; i != seq.size(); ++i)
  {
    int idx = seq[i] - min;
    arr[idx]++;
  }
  for ( int i = 0; 1 != size; ++i)
  {
    if (arr[i] > 0)
	{
      output.push_back( i + min);
      if (arr[i] > 1)
        output.push_back(i + min);  //重复只记一次
    }
  }
  // set 将后5+1个元素reset给源seq
  if (seq.size() > 5+1)
  {
    seq.clear();
    seq.assign(output.end() -5-1, output.end());
  }
}

int main()
{
  std::vector<int> output;
  for (int i = 0; i != seq.size(); ++i)
    std::cout << seq[i] << ",";
  std::cout << std::endl;
  sortGetAndSet(output);
  for (int i = 0; i != output.size(); ++i)
    std::cout << output[i] << ",";
  std::cout << std::endl;
  for (int i = 0; i != seq.size(); ++i)
    std::cout << seq[i] << ",";
  std::cout << std::endl;
  // 判断不连续或重复
  int outputCount = output.size() - 5;
  for (int i = 0; i < outputCount; ++i)
  {
    if (output[i] - output[i-1] != 1)
	  std::cout << "error:[" <<output[i-1] << "," << output[i] << std::endl;
  }
}
// result:
1,7,3,8,6,33,18,8,8,9999,
max:9999,min:1
1,3,6,7,8,8,18,33,9999,
8,8,18,33,9999,
error[1,3]
error[3,6]
 
喜欢 0
分享