所以,我在这个插入排序算法上非常努力,我不明白为什么要得到这个输出。我已经把它写在纸上,当我一步一步走过它的时候,它就在那儿工作了……发生了什么事?

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

最佳答案

当条件错误时:

while (i >= 0 && arrayIn[i] < arrayIn[j])

应该是:
while (i >= 0 && arrayIn[i] < temp)

因为在while循环的第一次迭代中arrayIn[j]只不过是arrayIn[i + 1]而已,而在while循环中arrayIn[i+1] = arrayIn[i];可以被重写。
在插入排序中,在排序数组中插入一个值,在外循环中,在arrayIn[j]中读取temp。现在您要在排序位置插入temp,对于小于arrayIn[i]的每个temp,第一次需要一个移位arrayIn[i+1] = arrayIn[i];,您可以在arrayIn[j] = arrayIn[i];时写入arrayIn[j] > arrayIn[i];,因为j = i + 1
编辑,来自@M Oehm
你的外循环只运行i=1到3,不插入arrayIn[4]到排序位置,改变j < 5 - 1;j < 5

07-24 19:50