所以,我有一些C代码用于bitonic排序,我试图将该代码转换为C#。 C代码中的一行让我很困惑。我之前从未与C合作过。
void merge_up(int *arr, int n) {
int step=n/2,i,j,k,temp;
while (step > 0) {
for (i=0; i < n; i+=step*2) {
for (j=i,k=0;k < step;j++,k++) {
if (arr[j] > arr[j+step]) {
// swap
temp = arr[j];
arr[j]=arr[j+step];
arr[j+step]=temp;
}
}
}
step /= 2;
}
}
void merge_down(int *arr, int n) {
int step=n/2,i,j,k,temp;
while (step > 0) {
for (i=0; i < n; i+=step*2) {
for (j=i,k=0;k < step;j++,k++) {
if (arr[j] < arr[j+step]) {
// swap
temp = arr[j];
arr[j]=arr[j+step];
arr[j+step]=temp;
}
}
}
step /= 2;
}
}
void printArray(int *arr, int n) {
int i;
printf("[%d",arr[0]);
for (i=1; i < n;i++) {
printf(",%d",arr[i]);
}
printf("]\n");
}
int main(int argc, char **argv) {
int n, *arr, i,s;
FILE *fp = fopen(argv[1],"r");
if (fp == NULL) {
fprintf(stderr,"file not found\n");
exit(1);
}
// first line gives number of numbers to be sorted
fscanf(fp,"%d",&n);
// allocate space and read all the numbers
arr = (int *)malloc(n*sizeof(int));
for (i=0; i < n; i++) {
fscanf(fp,"%d",(arr+i));
}
// print array before
printArray(arr,n);
// do merges
for (s=2; s <= n; s*=2) {
for (i=0; i < n;) {
merge_up((arr+i),s);
merge_down((arr+i+s),s); //Having trouble with this line here.
i += s*2;
}
}
printArray(arr,n);
}
当它调用merge_down((arr + i + s),s)时它在做什么;
具体来说,arr + i + s。 arr是数组,但+ i + s在做什么?我真的很感激一些帮助。
-EDIT:我应该添加我在C#中为该部分所做的事情。这就是我所拥有的:
//Do merges
for (int s = 2; 2 <= n; s = s * 2)
{
for(int i = 0; i < n;){
mergeUp(arr, s);
mergeDown(arr, s);
i += s * 2;
}
}
答案 0 :(得分:4)
指针算术。 arr
是指向数组开头的指针,因此它与创建指向arr[i+s]
的指针基本相同。
C#不支持指针运算(unsafe
代码除外)。要将此代码转换为C#,您必须创建一个新数组以传递到mergeDown
或更改mergeDown
的签名以获取startIndex
参数。或者,您可以mergeDown
接受IEnumerable<T>
或ArraySegment<T>
并使用@ JimBalter的答案。
答案 1 :(得分:1)
我应该添加我在C#中为该部分所做的事情。这就是我所拥有的:
...
mergeUp(arr, s);
mergeDown(arr, s);
你想要的是
mergeUp(arr.Take(i), s);
mergeDown(arr.Take(i+s), s);
或者更好地使用ArraySegment<T>
。见Array slices in C#