我正在尝试使用Insertion Sort对数组进行排序 我没有更改和重新排列数组本身的元素,而是使用另一个名为rank的数组来指向原始数组 这是我的代码
int i,j;
int ar[] = {50,14,51,25,10};
int rank[] = {0,1,2,3,4};
for(i=1 ; i< 5 ; ++i) // second element onwards
{
int temp = rank[i]; // stores current value in temp variable
/**
* temp = 1
* j = 0
*/
j = rank[i] - 1;
while ( ar[temp] < ar[ rank[j] ] && j > -1)
{
rank[j+1] = rank[j]; // move elemnts in map forward
j--;
} // end loop
// insert temp at proper place
rank[j+1] = temp;
}
for(i=0 ; i< 5 ; ++i)
printf("Rank : %d, Number : %d \n",rank[i],ar[i]);
但是,它没有给出预期的输出。任何人都可以指出逻辑中的错误是什么吗?
答案 0 :(得分:1)
你的逻辑缺陷如下: 在此代码部分
while ( ar[temp] < ar[ rank[j] ] && j > -1)
{
rank[j+1] = rank[j]; // move elemnts in map forward
j--;
} // end loop
rank[j]
表示ar[j]
处的值的等级。
当您使用ar[rank[j]]
时,您将ar[temp]
与"the rank of the value at ar[ j ]"
处的索引值进行比较,这意味着您没有与{{1}的已排序部分中的最大值进行比较}}
因此,即使rank[]
是第二小的
例如:
到目前为止,在循环#2 ar[temp]
ar []:{50,14,51,25,10};
排名[]:{1,0,2,3,4}; ({1,0}是排名[]的排序部分
(i = 2)
仅表示0
是14
中的最小值({50,14}
的扫描部分)
AND ar[]
(ar[rank[2]]
)恰好是ar[0]
中最大的值({50,14}
的扫描部分)巧合
如果此值(ar[]
)不是最大值,并且恰好小于ar[rank[2]]
,则程序将跳过循环。即使ar[temp]
小于ar[temp]
答案 1 :(得分:0)
rank[j+1] = rank[j]
毫无意义。你应该交换它们。
答案 2 :(得分:0)
这是我在使用数据结构类时的代码......
在while条件下,它检查V ...并在循环内部移动元素V ...
在您的代码中,您将在一个数组中进行比较并在另一个数组中进行移动...如果您需要元素的原始位置,则可以将数组复制到新数组中并对新数组进行排序,而不是创建这些数组。 ..(如果你真的需要那些排名,我很确定你可以在排序时创建)