所以,我在这个插入排序算法上苦苦挣扎,我无法理解为什么我得到这个输出。我已经在纸上完成了它,当我逐步完成它时,它在那里工作......发生了什么事?
int main(int argc, char * argv[]){
int arrayIn[5];
/* Insertion func */
printf("==============================\n");
for(int k=0; k<5; k++){
arrayIn[k] = k + 1;
}
for(int y = 0; y < 5; y++){
printf("array[%d]: %d \n", y, arrayIn[y]);
}
//insertion
for (int j = 1; j < 5 - 1; j++) {
int i = j - 1;
int temp = arrayIn[j];
while (i >= 0 && arrayIn[i] < arrayIn[j] /* Aj < Ai */) {
arrayIn[i+1] = arrayIn[i];
i--;
}
arrayIn[i+1] = temp;
}
for(int p = 0; p < 5; p++){
printf("array[%d]: %d \n", p, arrayIn[p]);
}
return(0);
}
这是我得到的输出:
插入前排序:
array[0]: 1
array[1]: 2
array[2]: 3
array[3]: 4
array[4]: 5
插入后排序:
array[0]: 2
array[1]: 3
array[2]: 4
array[3]: 1
array[4]: 5
答案 0 :(得分:2)
虽然条件错误:
while (i >= 0 && arrayIn[i] < arrayIn[j])
应该是:
while (i >= 0 && arrayIn[i] < temp)
因为arrayIn[j]
在while循环的第一次迭代中只是arrayIn[i + 1]
,因此可以在arrayIn[i+1] = arrayIn[i];
中覆盖。
在插入排序中,您在有序数组中插入一个值,在外部循环中,您在arrayIn[j]
中读取temp
。现在您要在排序的位置插入temp
,并且对于小于arrayIn[i]
的每个temp
,需要一个班次arrayIn[i+1] = arrayIn[i];
首次您可以写信给{{1} } arrayIn[j] = arrayIn[i];
因为arrayIn[j] > arrayIn[i];
。
编辑,来自@ M Oehm:
您的外部for循环运行仅适用于i = 1到3,并且不会将j = i + 1
插入到排序位置,将arrayIn[4]
更改为j < 5 - 1;
。