【问题标题】:Insertion Sort (descending order) -- what am I missing here?插入排序(降序)-我在这里缺少什么?
【发布时间】:2014-01-26 12:14:15
【问题描述】:

所以,我在这个插入排序算法上苦苦挣扎,我不明白为什么我会得到这个输出。我已经在纸上完成了它,当我逐步完成它时它就在那里工作......这是怎么回事?

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

【问题讨论】:

    标签: c sorting insertion-sort


    【解决方案1】:

    条件错误时:

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

    应该是:

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

    因为 arrayIn[j] 在 while 循环的第一次迭代中只不过是 arrayIn[i + 1],可以在 while 中用 arrayIn[i+1] = arrayIn[i]; 覆盖。

    在插入排序中,您在排序后的数组中插入一个值,在外循环中,您在temp 中读取arrayIn[j]。现在您要在排序位置插入temp,并且对于小于temp 的每个arrayIn[i],需要进行一次移位arrayIn[i+1] = arrayIn[i]; 第一次如果arrayIn[j] &gt; arrayIn[i];,您可以写信给arrayIn[j] = arrayIn[i];,因为j = i + 1

    编辑,来自@M Oehm: 您的外部 for 循环仅针对 i = 1 到 3 运行,并且不会将 arrayIn[4] 插入到排序位置,将 j &lt; 5 - 1; 更改为 j &lt; 5

    【讨论】:

    • 是的,我自己也意识到了这一点。但是,我的输出还是不太对……
    • 您还必须调整外循环以从[1:5)for (int j = 1; j &lt; 5 - 1; j++)运行。
    猜你喜欢
    • 1970-01-01
    • 2020-09-21
    • 2010-12-24
    • 2012-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多