Performance 交换和转移之间有什么区别?
下面是插入排序的算法。第一种使用移位机制将值放置在左排序部分。第二种方法交换连续的值,直到左边的部分被排序Performance 交换和转移之间有什么区别?,performance,algorithm,sorting,Performance,Algorithm,Sorting,下面是插入排序的算法。第一种使用移位机制将值放置在左排序部分。第二种方法交换连续的值,直到左边的部分被排序 转移 function insertionSort(array A) for i from 1 to length[A]-1 do value := A[i] j := i-1 while j >= 0 and A[j] > value do A[j+1] := A[j] j := j-1 done A[j+
function insertionSort(array A)
for i from 1 to length[A]-1 do
value := A[i]
j := i-1
while j >= 0 and A[j] > value do
A[j+1] := A[j]
j := j-1
done
A[j+1] = value
done
function insertionSort(array A)
for (i =0; i<N; i++)
for(int j=i; j>0; j--)
if(less(A[j], A[j-1]))
exch(A, j, j-1)
else
break;
done
done
这符合算法2。但在算法1的情况下,分析变成:
Worst case performance: O(n^2) comparisons, O(n) swaps
Best case performance: O(n) comparisons, O(1) (no) swaps
Average case performance: O(n^2) comparisons, O(n) swaps
请澄清移位和交换的含义。回答一般问题:移位是将所有元素移动一个位置。交换是在两个不同的索引处交换元素 考虑以下数组:
a b c d e f
假设我们想把元素e
放在第二个位置
移位通过移位,数组变为
a e b c d f
a e c d b f
(序列bcd
向右移动了一个,为插入e
留出了空间。)
交换通过交换,阵列变为
a e b c d f
a e c d b f
(元素b
和e
交换了位置。)
对于您发布的特定算法,第一个算法只是将元素向右移动,直到找到新元素所在的位置,然后插入它。第二个将元素放在末尾,然后重复地将新元素与前一个元素交换,直到发现它位于正确的位置
编辑:关于两种算法在性能分析上的差异:我认为基于移位的算法的分析是有缺陷的,因为它没有计算外循环每次迭代期间移位O(n)元素(最差和平均情况下的性能)的工作量。尽管移位既不是比较也不是交换,但它仍然代表着工作(大约是交换的三分之一,但常数乘数在大O计算中并不重要)
如果一个人(错误地)忽略了转移的成本,那么差异很容易解释。在移位的情况下,外循环的每次迭代都需要内循环的O(n)次迭代,但只需要一次交换(一旦找到插入位置)。另一方面,基于交换的算法对外部循环每次迭代执行的最后一次比较以外的所有比较进行交换
另外,我在中没有看到两个单独的性能分析,也没有看到基于交换的实现。回答一个一般性问题:移位是将所有元素移动一个位置。交换是在两个不同的索引处交换元素 考虑以下数组:
a b c d e f
假设我们想把元素e
放在第二个位置
移位通过移位,数组变为
a e b c d f
a e c d b f
(序列bcd
向右移动了一个,为插入e
留出了空间。)
交换通过交换,阵列变为
a e b c d f
a e c d b f
(元素b
和e
交换了位置。)
对于您发布的特定算法,第一个算法只是将元素向右移动,直到找到新元素所在的位置,然后插入它。第二个将元素放在末尾,然后重复地将新元素与前一个元素交换,直到发现它位于正确的位置
编辑:关于两种算法在性能分析上的差异:我认为基于移位的算法的分析是有缺陷的,因为它没有计算外循环每次迭代期间移位O(n)元素(最差和平均情况下的性能)的工作量。尽管移位既不是比较也不是交换,但它仍然代表着工作(大约是交换的三分之一,但常数乘数在大O计算中并不重要)
如果一个人(错误地)忽略了转移的成本,那么差异很容易解释。在移位的情况下,外循环的每次迭代都需要内循环的O(n)次迭代,但只需要一次交换(一旦找到插入位置)。另一方面,基于交换的算法对外部循环每次迭代执行的最后一次比较以外的所有比较进行交换
另外,我在中没有看到两个单独的性能分析,也没有看到基于交换的实现。交换意味着交换位置。 示例:12345 交换第二个loc和第五个loc将给出输出:1 5 3 4 2 移位意味着简单地从当前位置移位。 示例:12345 左移两位:3 4 5空
插入排序使用移位。它存储要插入到某个变量中的元素,找到变量的正确位置并向右移动一个位置。在您的情况下,您通过交换不必要的相邻元素来移动。这是一种开销。交换意味着交换位置。 示例:12345 交换第二个loc和第五个loc将给出输出:1 5 3 4 2 移位意味着简单地从当前位置移位。 示例:12345 左移两位:3 4 5空
插入排序使用移位。它存储要插入到某个变量中的元素,找到变量的正确位置并向右移动一个位置。在你的例子中,你通过交换不必要的相邻元素来转移。这是一种开销。我要说的是维基百科给出的分析,即 最坏情况性能:O(n^2)比较、互换 最佳案例性能:O(n)比较,O(1)交换 平均案例绩效:O(n^2)比较、互换 是正确的,根据算法2。但在主要文本中,我找到了用于插入排序的算法1。但在这种情况下,分析将变得更加重要 最坏情况性能:O(n^2)比较,O(n)交换 最佳案例绩效:O(n)比较,O(1)(无)互换 平均案例绩效:O(n^2)比较,O(n)交换 一般情况下应考虑什么。基于移位的算法或基于完全交换的算法。我所做的