【问题标题】:Do insertion and selection sorts comparisons and swaps time are equal?插入和选择排序比较和交换时间是否相等?
【发布时间】:2017-12-26 06:28:06
【问题描述】:

在我的代码中,我计算了插入排序和选择排序比较和交换时间。但我看到它们在比较和交换方面是平等的。 但我使用 while 循环进行插入。我可以使用 for 循环进行选择。 看代码。

    <?php
$a = array(4,1,7,9,3,2,6,8,10,20,14,29,54,27,563,4,563,334,2,7,5,42,24);
$num = sizeof($a);


for ($i=0; $i < $num; $i++) { 
  echo "$a[$i] | ";
}
echo "<br>";


echo "<br>Selection<br>";

//selection sort
$swap = 0;
$com = 0;
for ($inner=0; $inner < $num-1; $inner++) { 
  $min = $inner;

  for ($i=$inner+1; $i < $num; $i++) { 

    if ($a[$i] < $a[$min]) {
       $min = $i;

    }
     $com++;

  }
  $swap++;
  $past = $a[$inner];
  $a[$inner] = $a[$min];
  $a[$min] = $past;
}


for ($k=0; $k < $num; $k++) { 
  echo "$a[$k] | ";
}

echo "Com : <span style='color:red;'>$com</span> ";
echo "Swap  :<span style='color:red;'> $swap</span> ";



echo "<br>Insertion<br>";


$swap = 0;
$com = 0;

for ($out=1; $out < $num ; $out++) { 
   $temp = $a[$out];

   for ($i=$out; $i > 0; $i--) { 
         if ($a[$i-1] >= $temp) {
          $a[$i] = $a[$i-1];
         }
         $com++;
   }
   $a[$i] = $temp;
   $swap++;
}

for ($k=0; $k < $num; $k++) { 
  echo "$a[$k] | ";
}

echo "Com : <span style='color:red;'>$com</span> ";
echo "Swap  :<span style='color:red;'> $swap</span> ";




?>

现在。你怎么能告诉我插入排序在任何情况下都比选择排序快?因为它们在我的代码中总是一样的!谢谢

【问题讨论】:

  • 我的回答解决了你的疑惑吗?

标签: php algorithm sorting


【解决方案1】:

目前,我还没有一个框架来测试这两种算法的性能……但我认为我们可以从纯理论的角度对性能进行细分。

选择排序

它包括重复地从未排序的数组中选择第一个元素并将其与剩余的未排序元素进行比较。它类似于 冒泡排序,但不是交换较小的元素,而是保持更新最小元素索引并在每次迭代结束时交换它。

插入排序

它创建一个已排序的子数组并重复地将新元素插入其中。它遵循以下逻辑:

  • 将第一个元素作为已排序的子数组。
  • 将第二个元素插入已排序的子数组(根据需要移动)。
  • 将第三个元素插入已排序的子数组(根据需要移动)。
  • 冲洗并重复,直到没有更多元素。

结论

就时间复杂度而言,选择排序始终为(n * (n - 1)) / 2(转换为~O(n^2))。相反,插入排序可能会提供更好的性能,因为它的最坏情况时间复杂度只有(n * (n - 1)) / 2(与选择排序相同)。如果让我选择,我会选择插入排序算法,因为可能发生的最糟糕的事情是获得与选择排序相同的性能。您始终可以使用 microtime 并在两者上执行快速基准测试,以查看哪个为您带来最佳结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-10
    • 1970-01-01
    • 2014-11-25
    • 1970-01-01
    相关资源
    最近更新 更多