降序冒泡排序
bubble sort in descending order
int main()
{
int a[7] = {4,33,11,8,12,123,2}, temp;
for (int i = 7; i >= 0; i--)
{
for (int j = 7; j > 7 - i; j--)
{
if (a[j] > a[j - 1])
{
temp = a[j];
a[j] = a[j - 1];
a[j - 1] = temp;
}
}
}
for (int i = 0; i < 7; i++)
cout << a[i] << " ";
}
嘿,我想对数字进行冒泡降序排序,但我有一个问题,我的代码适用于 (ai >= 0),当我输入负数时给出了错误的输出。
例如当我输入 {4,33,-1,8,12,123,2} 时,输出是
123 33 12 8 4 2 0
你的程序有未定义的行为,因为在循环中你试图访问数组之外的内存。
也就是内循环
for (int j = 7; j > 7 - i; j--)
{
if (a[j] > a[j - 1])
{
temp = a[j];
a[j] = a[j - 1];
a[j - 1] = temp;
}
}
变量 j
的初始值为 7
并且您正在使用此值访问 if 语句中的数组元素。
事实上在循环的第一次迭代中你有
if (a[7] > a[6])
但 7
不是访问数组元素的有效索引。
用从 0 开始的索引编写循环会更简单。您只需要更改 if 语句中的比较表达式即可。
尽管如此,您的更新程序可以通过以下方式查找示例
#include <iostream>
int main()
{
int a[] = { 4, 33, -1, 8, 12, 123, 2 };
const size_t N = sizeof( a ) / sizeof( *a );
for ( const auto &item : a ) std::cout << item << ' ';
std::cout << '\n';
for ( size_t i = N; i != 0; --i )
{
for ( size_t j = N; --j != N - i; )
{
if ( a[j-1] < a[j] )
{
int tmp = a[j];
a[j] = a[j-1];
a[j-1] = tmp;
}
}
}
for ( const auto &item : a ) std::cout << item << ' ';
std::cout << '\n';
return 0;
}
程序输出为
4 33 -1 8 12 123 2
123 33 12 8 4 2 -1
一个更灵活的方法是编写一个单独的模板函数,除了前向迭代器类别的两个迭代器。
在这种情况下,要按降序对数组进行排序,使用反向迭代器调用函数就足够了。
int main()
{
int a[7] = {4,33,11,8,12,123,2}, temp;
for (int i = 7; i >= 0; i--)
{
for (int j = 7; j > 7 - i; j--)
{
if (a[j] > a[j - 1])
{
temp = a[j];
a[j] = a[j - 1];
a[j - 1] = temp;
}
}
}
for (int i = 0; i < 7; i++)
cout << a[i] << " ";
}
嘿,我想对数字进行冒泡降序排序,但我有一个问题,我的代码适用于 (ai >= 0),当我输入负数时给出了错误的输出。 例如当我输入 {4,33,-1,8,12,123,2} 时,输出是
123 33 12 8 4 2 0
你的程序有未定义的行为,因为在循环中你试图访问数组之外的内存。
也就是内循环
for (int j = 7; j > 7 - i; j--)
{
if (a[j] > a[j - 1])
{
temp = a[j];
a[j] = a[j - 1];
a[j - 1] = temp;
}
}
变量 j
的初始值为 7
并且您正在使用此值访问 if 语句中的数组元素。
事实上在循环的第一次迭代中你有
if (a[7] > a[6])
但 7
不是访问数组元素的有效索引。
用从 0 开始的索引编写循环会更简单。您只需要更改 if 语句中的比较表达式即可。
尽管如此,您的更新程序可以通过以下方式查找示例
#include <iostream>
int main()
{
int a[] = { 4, 33, -1, 8, 12, 123, 2 };
const size_t N = sizeof( a ) / sizeof( *a );
for ( const auto &item : a ) std::cout << item << ' ';
std::cout << '\n';
for ( size_t i = N; i != 0; --i )
{
for ( size_t j = N; --j != N - i; )
{
if ( a[j-1] < a[j] )
{
int tmp = a[j];
a[j] = a[j-1];
a[j-1] = tmp;
}
}
}
for ( const auto &item : a ) std::cout << item << ' ';
std::cout << '\n';
return 0;
}
程序输出为
4 33 -1 8 12 123 2
123 33 12 8 4 2 -1
一个更灵活的方法是编写一个单独的模板函数,除了前向迭代器类别的两个迭代器。
在这种情况下,要按降序对数组进行排序,使用反向迭代器调用函数就足够了。