我写了一个程序来排序数组的值。它有5个数组,
int arr1[] = { 3, 9, 6, 7 };
int arr2[] = { 2, 5, 5 };
int arr3[] = { 0 };
int arr4[] = { 1, 6 };
int arr5[] = { 4, 5, 6, 2, 1 };
和一个包含这5个数组的指针数组
int* pArr[LEN] = { arr1, arr2, arr3, arr4, arr5 };
我想对每个数组的值进行排序,但是当我将数组传递给排序函数时
sortArrValues(&pArr[i]);
它将每个数组的第一个索引(arr1
,arr2
...)视为该数组的元素(pArr[i]
),因此pArr[i]
是(3 ,2,0,1,4)。
但是我希望pArr[i]
成为它应该是的完整数组,所以在第一次迭代中pArr[i]
将是(3,9,6,7)。
注释 :每个数组的第一个索引表示该数组的长度(不包括该索引)。
排序将跳过第一个索引
还有两个附加功能,它们没有被使用(你可以跳过它们)。
这是完整的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LEN 5
void sortArrValues(int** arr);
void sortArrAdress(int* pArr);
void printArr(int * pArr);
int main()
{
int arr1[] = { 3, 9, 6, 7 };
int arr2[] = { 2, 5, 5 };
int arr3[] = { 0 };
int arr4[] = { 1, 6 };
int arr5[] = { 4, 5, 6, 2, 1 };
int* pArr[LEN] = { arr1, arr2, arr3, arr4, arr5 };
int i = 0;
for (i = 0; i < LEN; i++)
{
sortArrValues(&pArr[i]);
}
//sortArrAdress(pArr);
//printArr(pArr);
return 0;
}
/*
this function will sort the given arrays' values.
in: array
out: none
*/
void sortArrValues(int** arr)
{
int tmp = 0;
int i = 0;
for (i = 1; i < *arr; i++)
{
if (*arr[i] > *arr[i+1])
{
tmp = *arr[i];
*arr[i] = *arr[i + 1];
*arr[i + 1] = tmp;
}
}
}
答案 0 :(得分:1)
您的代码中存在一些错误。
首先,您不需要发送&pArr[i]
,pArr[i]
足以订购您的数组。然后,您的void sortArrValues(int** arr)
变为void sortArrValues(int* arr)
,更清晰易读。
其次,在你的sortValues中,当你改变一个值时,你应该重新启动(我知道它不是非常优化但是如果你想要更快地制作一些东西,你应该使用快速排序。代码,{ 4, 5, 6, 2, 1 }
将变为{ 4 5 2 1 6 }
。
这样你的代码就有了修复:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LEN 5
void sortArrValues(int* arr);
void sortArrAdress(int* pArr);
void printArr(int * pArr);
int main()
{
int arr1[] = { 3, 9, 6, 7 };
int arr2[] = { 2, 5, 5 };
int arr3[] = { 0 };
int arr4[] = { 1, 6 };
int arr5[] = { 4, 5, 6, 2, 1 };
int* pArr[LEN] = { arr1, arr2, arr3, arr4, arr5 };
int i = 0;
for (i = 0; i < LEN; i++)
{
sortArrValues(pArr[i]);
}
//sortArrAdress(pArr);
//printArr(pArr);
for (int i = 0 ; i < LEN ; i++) {
for (int j = 0 ; j < pArr[i][0] + 1 ; j++)
printf("%d ", pArr[i][j]);
printf("\n");
}
return 0;
}
/*
this function will sort the given arrays' values.
in: array
out: none
*/
void sortArrValues(int* arr)
{
int tmp = 0;
int i = 0;
for (i = 1; i < *arr; i++)
{
if (arr[i] > arr[i+1])
{
tmp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = tmp;
i = 0;
}
}
}
答案 1 :(得分:0)
我尝试修改您的程序以解决问题。其他人已经强调了其中一些问题。有些人没有。这是工作片段。如果您需要对任何修改进行更多解释,请与我们联系。请注意,我只修改了您的sort
功能。这个想法不是给你最快的排序算法,而是一个有效的算法。
int main()
{
int arr1[] = { 3, 9, 6, 7 };
int arr2[] = { 2, 5, 5 };
int arr3[] = { 0 };
int arr4[] = { 1, 6 };
int arr5[] = { 4, 5, 6, 2, 1 };
int* pArr[] = { arr1, arr2, arr3, arr4, arr5 };
int i = 0;
for (i = 0; i < LEN; i++)
{
sortArrValues(&pArr[i]);
}
}
void sortArrValues(int** arr)
{
int tmp = 0;
int i = 0, j = 0;
for (i = 0; i < (**arr) - 1; i++)
{
for(j=i+1; j < (**arr) - 1; j++) {
if ((*arr)[i+1] > (*arr)[j+1])
{
tmp = (*arr)[i+1];
(*arr)[i+1] = (*arr)[j + 1];
(*arr)[j+1] = tmp;
}
}
printf("%d ", (*arr)[i+1]);
}
printf("%d\n", (*arr)[i+1]);
}