C++数组从大到小排列排列问题,麻烦查一下错!

来源:百度知道 编辑:UC知道 时间:2024/09/24 02:46:49
我的意图是实现数组元素从大到小顺序输出!
请问程序1为什么不能实现程序2的功能?找了半天找不出原因,请高手指点一下!

程序1
#include <iostream>
#include <string>
using namespace std;

void main()
{
int a[5]={12, 54, 16, 35, 20};
int b[5]={ 0, 1, 2, 3, 4},temp;

for (int i=0; i<5; i++)
{
for (int j=i+1; j<5; j++)
{
if (a[i]<a[j])
{
temp = b[i]; b[i] = b[j]; b[j] = temp;
}
}
}

for (i=0; i<5; i++)
{
cout<<a[b[i]]<<" ";
}
cout<<endl;
}

程序2

#include <iostream>
#include <string>
using namespace std;
void main()
{
int a[5]={12, 54, 16, 35, 20};
int b[5]={ 0, 1, 2, 3, 4},temp;

for (int i=0; i<5; i++)
{
for (int j=i+1; j<5; j++)
{
if (a[i]<a[j])
{
temp = a[i]; a[i]

for (int i=0; i<5; i++)
{
for (int j=i+1; j<5; j++)
{
if (a[i]<a[j]) // 看这个条件
{
temp = b[i]; b[i] = b[j]; b[j] = temp;
}
}
}

--
if (a[i]<a[j])
你的目的是b保存a的索引,以达到不改变原a的前提下,通过改变b来达到有序输出.
但是你忽略了你上面这个判断条件,虽然你通过b排序了,但是你比较还是未排序的a元素,即是说,你通过b将a最大元素提到了前面,但是这个元素在a还是原来的位置.

修改为:
if (a[b[i]]<a[b[j]])
应该能解决问题(我现在没测试环境,所以也仅是粗略的看了下,这个修改未经测试.)
修改的目的:
既然b保存的是a的大->小有序索引,那么你的比较也应该以这个索引为准,而不是a本身的索引.

第一个a改成b啊,