我正在尝试让我的程序将这个数字数组从最小到最大排序,但输出却以其他方式输出。换句话说,我试图不使用[4],因为这就是这个算法正在做的事情,但我无法弄清楚如何。谢谢你的阅读。
输出: 9 12 3 14
#include <iostream>
using namespace std;
int main() {
int a[4] = {12, 9, 14, 3};
int temp;
for(int i = 0; i < 4; i++) {
if(a[i] > a[i + 1]) {
temp = a[i];
a[i] = a[i + 1];
a[i + 1] = temp;
}
cout << a[i] << " ";
}
return 0;
}
答案 0 :(得分:1)
您有三个错误:
错误1: 循环期间的越界访问。
此:
for(int i = 0; i < 4; i++)
应该是
for(int i = 0; i < 3; i++)
原因是如果您使用第一个(错误的)版本,则会出现缓冲区溢出:
if(a[i] > a[i + 1]) // if i == 3, a[3+1] == a[4] == out-of-bounds
错误2:排序时写入输出。
你这样做:
cout << a[i] << " ";
在排序中间。如果排序尚未完成,则打印出数组的值是没有意义的。
这应该放在排序代码之外(排序完成后):
for ( int i = 0; i < 4; ++i)
cout << a[i] << " ";
错误3:冒泡排序的执行不正确。
冒泡排序的工作原理是对数据进行多次传递,直到检测到数据已排序。您的代码只会传递一次数据,然后退出。
您需要做的是拥有while
或类似的循环,for
循环。如果数据需要至少再传递一次数据,则while
循环才会被执行。如果if
循环中的for
条件从未执行(意味着没有发生交换,因此数据已排序),您将知道何时对数据进行排序。
以下是一个例子:
int temp;
bool is_sorted = false;
while ( !is_sorted ) // execute while data is not sorted
{
isSorted = true; // assume data is sorted
for(int i = 0; i < 3; i++)
{
if(a[i] > a[i + 1])
{
//.. swap the items
//...
isSorted = false; // swap made, so data was not sorted
}
}
}
答案 1 :(得分:0)
已经有一个名为&#34; algorithm&#34;的头文件。你可以做到这一点:
#include <iostream>
#include <algorithm>
using namespace std;
typedef pair<char, int> new_pair;
struct sorting{
bool operator() (int i, int j){return i < j;}
}test_sort;
int main(void){
int test[4] = {5, 2, 1, 10};
sort(test, test + 3, test_sort);
for(int i = 0; i <= 3; i++){
cout <<test[i] << endl;
}
return 0;
}
我希望我帮助过你。