模板在C ++中排序

时间:2010-05-07 03:16:12

标签: c++ arrays templates sorting

嘿所有,我正在尝试编写一个排序函数,但我很难弄清楚如何初始化一个值,并使这个函数作为通用模板工作。排序依据:

  

在A [ii]> A [jj]找到一对=(ii,jj)=最小值= ii + jj =       如果存在这样的一对,那么         交换A [ii]和A [jj]否则          打破;

我写的函数如下:

template <typename T>
void sort(T *A, int size)
{
 T min =453;
 T temp=0;
 bool swapper = false;
  int index1 = 0, index2 = 0;
  for (int ii = 0; ii < size-1; ii++){
   for (int jj = ii + 1; jj < size; jj++){
    if((min >= (A[ii]+A[jj])) && (A[ii] > A[jj])){
     min = (A[ii]+A[jj]);
     index1 = ii;
     index2 = jj;    
     swapper = true;
    }
   }
  }
  if (!swapper)
   return;
  else
  {
   temp = A[index1];
   A[index1] = A[index2];
   A[index2] = temp;
   sort(A,size);
  }
 }

此函数将成功对整数数组进行排序,但不会对字符数组进行排序。 我不知道如何正确初始化比较开始的最小值。我尝试通过简单地将数组的前两个元素一起添加来初始化值(min = A [0] + A [1]),但在我看来,对于这个算法它会失败。我知道这是一种奇怪的类型,但它是测试的练习,所以感谢任何输入。

3 个答案:

答案 0 :(得分:2)

最可能的原因是它失败了,是因为char = 453不会产生453而是产生相当不同的数字,这取决于char是什么(有符号和无符号)。您的直接解决方案是使用numeric_limits,http://www.cplusplus.com/reference/std/limits/numeric_limits/

您可能还需要考虑设计,因为char的范围很小,添加两个字符时可能会经常溢出。

答案 1 :(得分:1)

任何类型的最大值为std::numeric_limits<T>::max()。它在<limits>中定义。

另外,考虑重新设计。这不是一个好的算法。在递归调用sort函数之前,我会确保我知道自己在做什么。

答案 2 :(得分:0)

我没有花太多时间阅读你的算法,但作为std::numeric_limits的替代,你可以使用数组中的初始元素作为初始最小值。然后,如果使用不专门化std::numeric_limits的类调用函数,则不必担心会发生什么,因此无法报告最大值。