数组的冒泡排序交换次数与插入排序的单个移位次数相同

时间:2018-12-08 19:29:57

标签: arrays algorithm sorting

我尝试在此处放置气泡排序计数器-

[[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等的输入数组。 但在所有情况下,数组的冒泡排序交换次数与插入排序的单个移位次数相同。有人可以解释吗?我的主要困惑在于掉期的数量与班次的数量如何相同,因为它们是在数组内移动元素的完全不同的机制。

2 个答案:

答案 0 :(得分:5)

插入顺序中的每个移位都会准确地纠正一个倒置

冒泡排序中的每个交换都可以正确地纠正一个反转。

因此对于相同的源数据,反转计数相似,并且交换和转移的次数相等。

这两种算法都一步一步地消除了反转。 请注意,例如,选择排序使用了另一种策略:它消除了最小元素的所有反转,但可能为交换元素创建了新的反转,然后消除了第二个最小元素的所有反转,依此类推。


通常,插入排序工作更快,因为移位更有效,元素移动更少。

对于随机值(最差的情况下为n^/4Sedgewick book),插入排序比较的平均次数约为n^2/2,而冒泡排序执行的比较次数为~n^2/2(如果不使用提前停车)

答案 1 :(得分:0)

排序(即插入和冒泡排序)都会针对相同的情况给出相同数量的反转。插入排序和冒泡排序之间的区别是对案例进行排序的迭代次数。 插入排序只需要进行一次迭代,因为它在前后方向都进行了比较,而冒泡排序仅在向前方向上进行了比较,因此比较了两个元素。在冒泡排序的每次迭代之后,数组中最大的元素冒泡到最后一个位置。