如何计算冒泡排序中的掉期?

时间:2015-08-22 01:24:46

标签: c++ arrays sorting

我正在尝试编写一个程序,只计算交换数量并计算排序数组的校验和。但是,我不确定为什么计数器没有得到正确的交换!我已经追踪了很多次,这应该是完美的。我错过了什么?

该程序可以购买只将正数作为数组的输入,终止程序并显示你应该输入的掉期" -1"

输入的简单示例:

  

1 4 3 2 6 5 -1

输出应为

  

3

但输出完全不正确。

#include"stdafx.h"
#include <iostream>
using namespace std;

void bubble_sort(unsigned long long int arr[], int n)
{
    int swaps=0;
    for (int i = 0; i < n-1; ++i) {
        for (int j = 0; j < n - i - 1; ++j) {
            if (arr[j] > arr[j + 1]) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
                swaps++;
            }
        }
    }

    cout << "Swaps: " << swaps << endl;
}

int main() {
    int count=0;
    unsigned long long int  input_ar[1000];
    cout << "Enter the numbers: " << endl;
    for (int i = 0; i < 1000; i++) {
        cin >> input_ar[i];
        if (input_ar[i] == -1) {
            break;
        }
        count++;
    }

    bubble_sort(input_ar, count);
    return 0;
}

2 个答案:

答案 0 :(得分:2)

对于系列1 4 3 2 6 5,您首先交换43(一次交换),然后42(两次交换),然后{ {1}}和6(三次互换)。这会让你得到像5这样的数组,所以直到没有完全排序,你将有另一个交换来使1 3 2 4 5 6在正确的位置,导致四次交换(如果代码按原样运作。

答案 1 :(得分:0)

删除了之前的回答。

你的程序工作正确;它应该是4.为了这个工作,我采用了unsigned long long并简单地将它设置为int。在交换变量增加后立即添加以下代码,您将看到确切的每个交换发生。

            cout << endl;
            cout << "Swap count: " << swaps << endl;
            cout << arr[j] << " is swapped with " << arr[j + 1] << endl;
            for (int a = 0; a < n; a++) {
                cout << arr[a] << " ";
            }
            cout << endl;

结果:

旧阵列:1 4 3 2 6 5

交换计数1: 3与4交换; 1 3 4 2 6 5

交换计数2: 2与4交换; 1 3 2 4 6 5

交换计数3: 5与6交换; 1 3 2 4 5 6

交换计数4: 2与3交换; 1 2 3 4 5 6

互换:4

新阵列:1 2 3 4 5 6

我建议下次遇到问题时,你需要在特定的部分使用cout语句,以确保程序正在做的事情是正确的。