C-如何在组中以一维数组的形式对数字进行排序



我有一个数组,我需要在组中对该数组中的数字进行排序。例如,如果我有9个数字,而我的P为3,则需要按降序排序3个数字,然后再进行3个。

示例:

123124125222223224333334335

m是组的数量,P是组中的数量。如果m为3,p也为3,则需要给出

之类的答案

125124123224223222335334333

这是我想到的,但它不起作用。

void sortgroup(int M, int P, int A[i])
{
      int c, d, swap, z = 0;
      for (c = z ; c < ( P*M - 1 + z ); c++)
      {
        for (d = z ; d < P + z - 1; d++)
        {
          if (A[d] < A[d+1])
          {
            swap       = A[d];
            A[d]   = A[d+1];
            A[d+1] = swap;
          }
        }
      z = P + z;
      }
}

您的函数sortgroup尝试一次执行太多 - 并且您有很多本地变量,全部命名。

首先,解决问题:将输入数组分解为M块/长度P组,然后分别处理每个块,这将使您的代码清洁。

抽象:

void sortGroups(int* array, size_t arrayLength, size_t groupLength, size_t groupCount) {
    // get each group:
    for( size_t i = 0; i < arrayLength; i += groupLength ) {
        size_t start = i;
        size_t end   = min( i + groupLength, arrayLength );
        sortSingleGroup( array, start, end );
    }
}
void sortSingleGroup(int* array, size_t start, size_t end) {
    // sort the numbers in the range array[start] to array[end-1]
    // there are plenty of sorting libraries/functions you can download from the interwebs to do this
}

请注意我如何使用非晶变量名称,以及对组进行分类的子问题从将数组分为组的初始问题中删除。

另外,添加输入验证是一个主意:

void sortGroups(int* array, size_t arrayLength, size_t groupLength, size_t groupCount) {
    assert( array != NULL ); // prevent segfault/access-violation
    assert( groupLength > 0 ); // prevent infinite-loop
    if( arrayLength == 0 ) return; // optimization
    if( groupCount == 0 ) return; // optimization
    ...
void sortSingleGroup(int* array, size_t start, size_t end) {
    assert( array != NULL ); // prevent segfault/access-violation
    assert( start < end ); // sanity-check
    ...

最新更新