我尝试在此处放置气泡排序计数器-
[[1]]
character(0)
[[2]]
[1] ". I am a sentence and I contain column but also Barr."
[[3]]
[1] "Barr and column and also column." ". Now again column and Barr"
并在此处进行插入排序-
for (i = 0; i < n-1; i++)
for (j = 0; j < n-i-1; j++)
if (arr[j] > arr[j+1]) {
swap(&arr[j], &arr[j+1]);
printf("%d of %d\n", i, n);
count++; // here
}
并尝试了各种大小为10、20、50、1000等的输入数组。 但在所有情况下,数组的冒泡排序交换次数与插入排序的单个移位次数相同。有人可以解释吗?我的主要困惑在于掉期的数量与班次的数量如何相同,因为它们是在数组内移动元素的完全不同的机制。
答案 0 :(得分:5)
插入顺序中的每个移位都会准确地纠正一个倒置
冒泡排序中的每个交换都可以正确地纠正一个反转。
因此对于相同的源数据,反转计数相似,并且交换和转移的次数相等。
这两种算法都一步一步地消除了反转。 请注意,例如,选择排序使用了另一种策略:它消除了最小元素的所有反转,但可能为交换元素创建了新的反转,然后消除了第二个最小元素的所有反转,依此类推。
通常,插入排序工作更快,因为移位更有效,元素移动更少。
对于随机值(最差的情况下为n^/4
(Sedgewick book),插入排序比较的平均次数约为n^2/2
,而冒泡排序执行的比较次数为~n^2/2
(如果不使用提前停车)
答案 1 :(得分:0)
排序(即插入和冒泡排序)都会针对相同的情况给出相同数量的反转。插入排序和冒泡排序之间的区别是对案例进行排序的迭代次数。 插入排序只需要进行一次迭代,因为它在前后方向都进行了比较,而冒泡排序仅在向前方向上进行了比较,因此比较了两个元素。在冒泡排序的每次迭代之后,数组中最大的元素冒泡到最后一个位置。