如何计算插入排序中的比较和交换? (JAVA)

时间:2015-03-18 16:09:44

标签: java insertion-sort

public class Sorting
{
   public static int numOfComps = 0,
                     numOfSwaps = 0;

   public static void insertionSort(int[] array)
   {
      int unsortedValue;  // The first unsorted value
      int scan;           // Used to scan the array

      // The outer loop steps the index variable through 
      // each subscript in the array, starting at 1. The portion of
      // the array containing element 0  by itself is already sorted.
      for (int index = 1; index < array.length; index++)
      {
         // The first element outside the sorted portion is
         // array[index]. Store the value of this element
         // in unsortedValue.
         unsortedValue = array[index];

         // Start scan at the subscript of the first element
         // outside the sorted part.
         scan = index;

         // Move the first element in the still unsorted part
         // into its proper position within the sorted part.
         while (scan > 0 && array[scan-1] > unsortedValue)
         {
            array[scan] = array[scan - 1];
            scan--;

                // Counts the number of values swaps
                numOfSwaps ++;
         }

         // Insert the unsorted value in its proper position
         // within the sorted subset.
         array[scan] = unsortedValue;

         // Counts the number of values comparisons
        numOfComps ++;
      }
        System.out.println("\n\nNumber of comps = " + numOfComps);
       System.out.println("Number of swaps = " + numOfSwaps);       
   }
}

新手再来一次。如何使用Java编写此插入排序程序来计算比较次数和交换次数?我已将比较和交换代码插入到程序中,但不确定它们是否在正确的位置。我已发布该程序。谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

比较次数是执行array[scan-1] > unsortedValue的次数。那不是你在想的。

提示:

  • while (EXPRESSION) { STATEMENTS }可以重写为while (true) { if (!(EXPRESSION)) { break; } STATEMENTS }

  • !(EXPRESSION1 && EXPRESSION2)可以重写为!(EXPRESSION1) || !(EXPRESSION2)

  • if (EXPRESSION1 || EXPRESSION2) { break; }可以重写为if (EXPRESSION1) { break; } if (EXPRESSION2) { break; }


算法不会交换变量对的值。但是,有一种形式的多变量交换(A⇒B,B⇒C,C⇒D,D⇒A)。发生这种情况的次数是array[scan] = unsortedValuescan不同时执行index次的次数。那不是你在想的。


注意:

  • 您的代码有问题。当你到达scan时,-1可以是array[scan] = unsortedValue;。排序2, 1

  • 时会发生这种情况
  • 请注意,这是插入排序的不良实现。应该使用二进制搜索而不是线性搜索。这将减少从N * N到N * log N的最大比较次数。