今天我练习编写的程序基本上将用户的输入从最大值排序到最小值,并在排序后显示信息。为了做到这一点,我查了一些算法并遇到了冒泡排序方法。在阅读了一些文章之后,我理解它基本上是如何工作的,所以我继续讨论了一些泡泡排序算法的示例编码,并将我从示例中学到的内容实现到我的程序中。从我收到的输出中,似乎冒泡排序方法在某种程度上起作用。据我所知,我编写的冒泡排序算法/代码似乎只运行一次数组,而不是遍历数组,直到所有整数都被排序为最大值到最小值列表。有人可以帮我查看我的代码(特别是冒泡排序部分)并指出我正确的方向吗?
以下代码:
#include < iostream >
using namespace std;
int main() {
int pancakes[10];
int x;
int valueSwitched;
for (x = 0; x < 10; x++) {
cout << "Please input the number of pancakes person " << (x + 1) << " has eaten.\n";
cin >> pancakes[x];
}
for (int x = 0; x < 9; x++) {
for (int y = 0; y < 9; y++) {
if (pancakes[x] > pancakes[x + 1]) {
int valueSwitched = pancakes[x];
pancakes[x] = pancakes[x + 1];
pancakes[x + 1] = valueSwitched;
}
}
}
cout << "\n-----ListSorted-----\n\n";
for (int x = 0; x < 10; x++) {
cout << "Person " << (x + 1) << " ate: " << pancakes[x] << endl;
}
return 0;
}
答案 0 :(得分:1)
您的排序代码与
完全相同for (int x = 0; x < 9; x++) {
if (pancakes[x] > pancakes[x + 1]) {
int valueSwitched = pancakes[x];
pancakes[x] = pancakes[x + 1];
pancakes[x + 1] = valueSwitched;
}
}
需要9倍的时间。
您必须交换x
和y
。
for (int y = 0; y < 9; y++)
{
for (int x = 0; x < 9; x++)
{
if (pancakes[x] > pancakes[x + 1])
{
int valueSwitched = pancakes[x];
pancakes[x] = pancakes[x + 1];
pancakes[x + 1] = valueSwitched;
}
}
}
或者为了更有效地做到这一点,试试这个:
for (int y = 9; y > 0; y--)
{
for (int x = 0; x < y; x++)
{
if (pancakes[x] > pancakes[x + 1])
{
int valueSwitched = pancakes[x];
pancakes[x] = pancakes[x + 1];
pancakes[x + 1] = valueSwitched;
}
}
}
答案 1 :(得分:1)
我在sorting
数字中发现了一个问题。所以你需要先学习bubble sort
。我在你的代码中改了一点。请看如下:
for (int x = 0; x < 9; x++) {
for (int y = 0; y < 9-x; y++) {// changes
if (pancakes[y] > pancakes[y + 1]) {//changes
int valueSwitched = pancakes[y];
pancakes[y] = pancakes[y + 1];
pancakes[y + 1] = valueSwitched;
}
}
}
现在提供输入9,8,7,6,5,4,3,2,1,0
并且它有效..
答案 2 :(得分:0)
在循环的内部循环中,您正在比较和交换pancakes[x]
和pancakes[x + 1]
,而不是比较和交换pancakes[y]
和煎饼[y + 1]。
for (int x = 0; x < 9; x++) {
for (int y = 0; y < 9; y++) {
if (pancakes[x] > pancakes[x + 1]) {
int valueSwitched = pancakes[x];
pancakes[x] = pancakes[x + 1];
pancakes[x + 1] = valueSwitched;
}
}
}
我认为这只是一个错字。
尽管如此,我想指出使用魔法并不是一个好主意 数字如9.还有一个传统,使用名称i,j,k,l,m和n作为索引。
对于算法本身,当数组已经排序时,它可以被停止。
考虑到您可以使用标准函数std::swap
来交换数组的元素。
当数组已经排序时循环停止迭代时,我将展示这种方法
#include <iostream>
int main()
{
const size_t N = 10;
int pancakes[N];
for ( size_t i = 0; i < N; i++ )
{
std::cout << "Please input the number of pancakes person " << i + 1 << " has eaten: ";
std::cin >> pancakes[i];
}
size_t n = N;
while ( !( n < 2 ) )
{
size_t last_sorted = 0;
for ( size_t i = 1; i < n; i++)
{
if ( pancakes[i-1] > pancakes[i] )
{
int valueSwitched = pancakes[i-1];
pancakes[i-1] = pancakes[i];
pancakes[i] = valueSwitched;
last_sorted = i;
}
}
n = last_sorted;
}
std::cout << "\n-----ListSorted-----\n\n";
for ( size_t i = 0; i < N; i++ )
{
std::cout << "Person " << i + 1 << " ate: " << pancakes[i] << std::endl;
}
return 0;
}
如果要输入例如
10 1 9 2 8 3 7 4 6 5
然后你会得到
Please input the number of pancakes person 1 has eaten: 10
Please input the number of pancakes person 2 has eaten: 1
Please input the number of pancakes person 3 has eaten: 9
Please input the number of pancakes person 4 has eaten: 2
Please input the number of pancakes person 5 has eaten: 8
Please input the number of pancakes person 6 has eaten: 3
Please input the number of pancakes person 7 has eaten: 7
Please input the number of pancakes person 8 has eaten: 4
Please input the number of pancakes person 9 has eaten: 6
Please input the number of pancakes person 10 has eaten: 5
-----ListSorted-----
Person 1 ate: 1
Person 2 ate: 2
Person 3 ate: 3
Person 4 ate: 4
Person 5 ate: 5
Person 6 ate: 6
Person 7 ate: 7
Person 8 ate: 8
Person 9 ate: 9
Person 10 ate: 10
如果你想保持一个人与人吃煎饼之间的关系,那么你应该声明一对数组。
这是一个示范程序
#include <iostream>
#include <utility>
int main()
{
const size_t N = 10;
std::pair<size_t, int> pancakes[N];
for ( size_t i = 0; i < N; i++ )
{
std::cout << "Please input the number of pancakes person " << i + 1 << " has eaten.\n";
pancakes[i].first = i + 1;
std::cin >> pancakes[i].second;
}
size_t n = N;
while ( !( n < 2 ) )
{
size_t last_sorted = 0;
for ( size_t i = 1; i < n; i++)
{
if ( pancakes[i-1].second > pancakes[i].second )
{
auto valueSwitched = pancakes[i-1];
pancakes[i-1] = pancakes[i];
pancakes[i] = valueSwitched;
last_sorted = i;
}
}
n = last_sorted;
}
std::cout << "\n-----ListSorted-----\n\n";
for ( size_t i = 0; i < N; i++ )
{
std::cout << "Person " << pancakes[i].first << " ate: " << pancakes[i].second << std::endl;
}
return 0;
}
对于与上面相同的输入,其排序输出将类似于
-----ListSorted-----
Person 2 ate: 1
Person 4 ate: 2
Person 6 ate: 3
Person 8 ate: 4
Person 10 ate: 5
Person 9 ate: 6
Person 7 ate: 7
Person 5 ate: 8
Person 3 ate: 9
Person 1 ate: 10