我有一个数组,我需要在组中对该数组中的数字进行排序.例如,如果我有9个数字而我的P是3,我需要按降序排序三个数字然后另外3个和另外3个.
例:
123 124 125 222 223 224 333 334 335
M是组数,P是组中的数量.如果M是3而P也是3则需要给出答案
125 124 123 224 223 222 335 334 333
这是我提出的,但它不起作用.
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;
}
}
Run Code Online (Sandbox Code Playgroud)
你的函数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
}
Run Code Online (Sandbox Code Playgroud)
注意我如何使用非神秘的变量名称,并且从将数组拆分成组的初始问题中删除了对组进行排序的子问题.
此外,添加输入验证是一个想法:
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
...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
161 次 |
| 最近记录: |