插入排序(降序) - 我在这里缺少什么?

时间:2014-01-26 12:14:16

标签: c sorting insertion-sort

所以,我在这个插入排序算法上苦苦挣扎,我无法理解为什么我得到这个输出。我已经在纸上完成了它,当我逐步完成它时,它在那里工作......发生了什么事?

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

1 个答案:

答案 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;