Raj*_*was -1 arrays sorting algorithm
我尝试在这里放置冒泡排序计数器 -
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
}
Run Code Online (Sandbox Code Playgroud)
并在这里插入排序 -
for (i = 1; i < n; i++) {
key = arr[i];
j = i-1;
while (j >= 0 && arr[j] > key) {
arr[j+1] = arr[j];
j = j-1;
count++;
}
arr[j+1] = key;
}
Run Code Online (Sandbox Code Playgroud)
并尝试了各种大小的输入数组,范围分别为10,20,50,1000等,但在所有情况下,数组的带有冒泡排序的交换数与插入排序的单个移位数相同.有人可以解释一下吗?我的中心困惑在于交换的数量与移位的数量是一样的,因为它们是阵列中移动元素的完全不同的机制.
插入排序的每个班次都只能纠正一次倒置
气泡排序中的每次交换都只能纠正一次反转.
因此对于相同的源数据,反转计数是相似的,并且交换和移位的数量是相等的.
这两个算法逐步消除了反转.请注意,选择排序例如使用另一种策略:它消除了最小元素的所有反转,但可能为交换元素创建新的反转,然后消除第二个最小元素的所有反转,依此类推.
通常,插入排序工作得更快,因为移位更有效,减少元素移动.
插入排序的平均比较大约n^/4是随机值(n^2/2在最坏的情况下)(Sedgewick书),而冒泡排序执行~n^2/2比较(如果不使用早期停止)
| 归档时间: |
|
| 查看次数: |
185 次 |
| 最近记录: |