气泡排序中的交换次数

Number of swaps in Bubble Sort

本文关键字:交换 排序 气泡      更新时间:2023-10-16

我有一个版本的气泡排序:

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);