Arrays 数组使用气泡排序的交换数与使用插入排序的单个移位数相同
我试着在这里放置气泡排序的计数器-Arrays 数组使用气泡排序的交换数与使用插入排序的单个移位数相同,arrays,algorithm,sorting,Arrays,Algorithm,Sorting,我试着在这里放置气泡排序的计数器- 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 } for
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
}
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;
}
(i=0;i
对于(j=0;jarr[j+1]){
掉期(&arr[j],&arr[j+1]);
printf(“%d,共%d\n”,i,n);
count++;//这里
}
对于这里的插入排序-
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
}
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;
}
(i=1;i
key=arr[i];
j=i-1;
而(j>=0&&arr[j]>键){
arr[j+1]=arr[j];
j=j-1;
计数++;
}
arr[j+1]=键;
}
并尝试了10、20、50、1000等各种大小的输入阵列。
但在所有情况下,一个数组使用冒泡排序的交换次数都与使用插入排序的单个移位次数相同。有人能解释一下吗?我的主要困惑在于交换的数量如何与移位的数量相同,因为它们是数组中移动元素的完全不同的机制。插入排序中的每个移位只纠正一个反转 泡沫排序中的每一次交换都只纠正一次反转 因此,对于相同的源数据,反演计数是相似的,交换数和移位数是相等的 这两种算法一步一步地消除反演。 请注意,例如,选择排序使用另一种策略:它消除最小元素的所有反转,但可能为交换的元素创建新的反转,然后消除第二个最小元素的所有反转,依此类推
通常,插入排序工作得更快,因为移位更有效,元素移动更少
此外,对于随机值(
n^2/2
在最坏的情况下)()插入排序的平均比较次数约为n^/4
),而冒泡排序执行~n^2/2
比较(如果不使用提前停止)对于相同的情况,插入排序和冒泡排序都将给出相同的反转次数。插入排序和冒泡排序的区别在于它们对案例进行排序的迭代次数。
插入排序只进行一次迭代,因为它在前向和后向上进行比较,而冒泡排序只在前向上移动并比较两个元素。在冒泡排序的每次迭代之后,数组中最大的元素冒泡到最后一个位置 你确定你正确地实现了这两种排序吗?@Lasse是的,我确定。我还使用了从合法网站直接复制的代码来确保。我认为排序中的成本问题是比较,而不是交换,因此尽管交换的项目数量完全相同,但气泡排序将比较更多的项目来完成这项工作,在我试过的一个测试程序中,1000个数字从0-1000随机分配,bubblesort进行了934.065次比较,而插入排序进行了248.631次比较。他们交换的数量是一样的。那么你确认他们交换的数量是一样的,这是完全正常的行为吗?这对我来说已经足够好了。我还通过比较算法进行了分析,是的,这是有道理的。谢谢这回答了前面提到的问题,但不是你通过阅读字里行间可以得到的问题。如果它们都做相同的事情(我知道,我知道),为什么插入排序通常比冒泡排序好?(我知道答案)好吧,我想我不知道你说你知道的确切答案,所以告诉我,因为这正是我需要的;一句具体的回答@Rajdeep Biswas是你问我的问题吗?不,对不起是为了@LasseVågsætherKarlsenNo,我的评论是为了MBo。他回答了你的问题,但我觉得你(拉杰迪普)提出了一个更大的问题。如果那是错的,我会道歉。