我正在尝试编写一个程序,只计算交换数量并计算排序数组的校验和。但是,我不确定为什么计数器没有得到正确的交换!我已经追踪了很多次,这应该是完美的。我错过了什么?
该程序可以购买只将正数作为数组的输入,终止程序并显示你应该输入的掉期" -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;
}
答案 0 :(得分:2)
对于系列1 4 3 2 6 5
,您首先交换4
和3
(一次交换),然后4
和2
(两次交换),然后{ {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语句,以确保程序正在做的事情是正确的。