气泡排序中的交换次数
Number of swaps in Bubble Sort
我有一个版本的气泡排序:
int i, j;
for i from n downto 1
{
for j from 1 to i-1
{
if (A[j] > A[j+1])
swap(A[j], A[j+1])
}
}
我想使用上述版本的气泡排序来计算预期的掉期次数。我使用的方法如下所示:
// 0 based index
float ans = 0.0;
for ( int i = 0; i < n-1; i++ )
{
for ( int j = i+1; j < n; j++ ) {
ans += getprob( a[i], a[j]); // computes probability that a[i]>a[j].
}
}
我走的路是正确的还是我错过了什么?
获得答案的最佳方法是运行气泡排序算法本身,并在 swap() 调用后包含一个计数器。您的计算函数将 (a) 几乎需要与排序本身一样长的时间(取决于 swap() 与 getprob() 的运行时),并且 (b) 错过了排序时元素顺序变化的点。
顺便说一句,swap() 调用的确切数量取决于你需要排序的数据 - 你有 n*(n-1)/2 个比较,其中任何一个都可能导致交换(平均而言,您需要交换比较元素的一半时间)。
也许这会有所帮助。基本上,这提供了一个框架来对一组模拟数据集运行气泡排序并计算交换概率。
设此概率 = p然后,要找到预期的交换操作数,您需要将其应用于实际数据集。设 n 是此数据集的大小。那么预期数字 = 交换概率 * n * n
n*n 是因为气泡排序有 n * n 个预期操作。
float computeSwapProbability()
{
int aNumSwaps = 0
int aTotalNumberOfOperations = 0
For all simulation datasets
{
int i, j;
for i from n downto 1
{
for j from 1 to i-1
{
aTotalNumberOfOperations++
if (A[j] > A[j+1])
{
swap(A[j], A[j+1])
aNumSwaps++
}
}
}
}
return (float)aNumSwaps/aTotalNumberOfOperations;
}
计算交换的最佳方法是在交换的 if 条件中包含计数器变量。
int swapCount=0;
for (i = 0; i < (length-1); ++i) {
for (j = 0; j < (length-i-1); ++j) {
if(array[j] > array[j+1]) {
temp = array[j+1];
array[j+1] = array[j];
array[j] = temp;
swapCount++;
}
}
}
printf("Swap count : %d" ,swapCount);
相关文章:
- shell排序中的交换和比较
- 排序时无法执行交换操作.我做的时候它会崩溃.为什么
- 插入排序的最小交换
- 不正确的比较和交换计数器输出用于快速排序功能
- 选择排序时交换函数调用的数量和完成的交换次数是否相同?
- 冒泡排序中所需的交换次数,而无需实际对其进行排序
- 修改的选择排序,选择最大的数字,然后交换到最后
- 为什么此代码上的排序算法不调用类的交换版本?
- 从递归向后选择排序函数调用 max 和交换函数
- 跟踪选择排序中的交换和比较次数
- 快速排序中的交换函数给出错误的输出
- 用于快速排序的最大元素交换次数
- 计数交换/比较合并排序算法的数字
- 每次交换后,如何使用任何排序算法打印到控制台
- 如何在快速排序算法中使已排序数组的交换次数为零
- 排序算法的交换函数不适用于排序函数中的参数。
- STL 中的排序方法不能交换向量中的内容
- 排序链表-移动节点还是交换数据成员
- 通过交换指针对字符数组进行排序,C++
- 交换排序比较和交换的次数