- 论坛徽章:
- 0
|
第一题,不用二楼说的reverse的方法的话可以这么做:
- #include <stdio.h>
- void DisplayArray(int *pArray, int nLen)
- {
- for (int i = 0; i < nLen; ++i)
- {
- printf("array[%d] = %d\n", i, pArray[i]);
- }
- }
- void SwapSubArray(int *pArray1, int *pArray2, int n)
- {
- int temp;
- for (int i = 0; i < n; ++i)
- {
- temp = *(pArray1 + i);
- *(pArray1 + i) = *(pArray2 + i);
- *(pArray2 + i) = temp;
- }
- }
- void ChangeArray(int *pArray, int nLen, int k)
- {
- if (NULL == pArray)
- return;
- if (k < 0 || k > nLen - 1)
- return;
-
- if (2 == nLen)
- {
- SwapSubArray(pArray, pArray + 1, 1);
- return;
- }
- int m, n, num;
- if (nLen - k - 1 > k + 1) // 如果后半部分的元素多
- {
- m = nLen - k - 1 - k - 1; // m是两部分元素数量之差
- SwapSubArray(pArray, pArray + k + 1 + m, k + 1); // 交换两部分元素数目相同的部分
- ChangeArray(pArray, nLen - k - 1, k);
- }
- else if (nLen - k - 1 < k + 1) // 如果前半部分的元素多
- {
- m = k + 1 - nLen + k + 1;
- SwapSubArray(pArray, pArray + k + 1, k + 1 - m); // 交换两部分元素数目相同的部分
- ChangeArray(pArray + nLen - k - 1, k + 1, m - 1);
- }
- else // 前后两部分元素数量相同
- {
- SwapSubArray(pArray, pArray + k + 1, k + 1);
- }
- }
- int main()
- {
- int array[] = {0, 1, 2, 3, 4, 5, 6, 7};
- int nLen = sizeof(array) / sizeof(array[0]);
- DisplayArray(array, nLen);
- ChangeArray(array, nLen, 1);
- printf("after change:\n");
- DisplayArray(array, nLen);
- return 1;
- }
复制代码
里面用到了递归,我不清楚是不是符合你的要求了.
具体的思想就是分别交换前后两部分数量相同的部分,然后再进行元素交换.
[ 本帖最后由 converse 于 2006-9-26 19:47 编辑 ] |
|