C++关于最大值排序法中数组无法赋值的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++关于最大值排序法中数组无法赋值的问题相关的知识,希望对你有一定的参考价值。

#include<iostream>

int main()

using namespace std;
int num,max;
cout<<"请输入数列元素个数:\n";
cin>>num;
int i,n,bf_lst[num],af_lst[num];
cout<<"请输数列元素,空格分开:\n";
for (i=0;i<num;i++) cin>>bf_lst[i];
max=bf_lst[0];
for (i=num-1;i>=0;i--)

for (n=0;n<num;n++)
if (bf_lst[n]>=max)

max=bf_lst[n];
bf_lst[n]=0; //这里出了问题,无法赋值为0

af_lst[i]=max;

for (i=0;i<num;i++) cout<<af_lst[i]<<" ";
system("pause");
return 0;


我的思路找出数组中的最大值并赋值max,再将这个元素赋值为0(相当于消掉了),最后将循环得到的max从后到前赋值给新数组,从实现排序。
如果数组中存在0,也不影响排序,0总是在序列最前面的。

0 是最前面的 那么-1呢?
哪那样赋值=0 如果第一个数最大
等你循环一遍过后初了最后一个 其余全都被你赋值为0 了追问

我的意思是有一个新数组,将就数组中的最大值赋值给新的数组,再将旧的那个元素为0,下次循环时会产生新的最大值,直至就数组中所有元素为0,新数组也赋值完了。

追答

哪要是旧的数组里面有负数 但是没 0 怎么办
如果是这个数组 bf_lst[5]=-1,0,1,2,3,你看看第一次循环出来 初了max=3 其他都是0 了

追问

很抱歉,我忘了说了,我支只需要处理非负数

你只要告诉我
bf_lst[n]=0;
这里为什么无法赋值

追答

可以赋值的!
你把报的什么错误贴出来吧
还有 你那样写法是错误就是不能达到你的目的的 这种排序不要赋值 最好是交换两个数

追问

可以通过编译,就是那一句有和无没有作用,
输出的新数组都是最大值

追答

这是赋值成功了的啊
你这样的结果就是我说那个 在第一次循环的时候除了最后一个 Max存在 其他都被赋值成了0 了
然后第二次 第三次 。。。。每次都把那个最大的读出来了
详细的说吧
在循环开始之前 你把第一数 8给了Max了 然后开始循环
n=0的时候bf_lst[0]=8 满足>=Max (因为等于满足嘛!)
那就执行if语句 max=bf_lst[0]
接着执行bf_lst[0]=0; (这里是关键啊) 你这一赋值8 没了
然后和bf_lst[1]=9 比较 还是满足>= max=8 又执行if语句
max=bf_lst[]=9; 然后呢bf_lst[1]=0;这下一赋值 9也没有了 就只有max=9了
第一次就没有比9 大得了 af_list[0]=9

二次循环 max=9 上一次取到的嘛
bf_list[0]和bf_list[1] 都等于0 你赋值了的嘛
后面的都小于 max 值没变 最后 max还是等于9 af_list[1] =9
就这样一直循环下去 全是9
懂了没?

参考技术A 就是冒泡排序,不需要另外一个数组,两重循环就可以了,很简单。
void sort(int data[],int n)

for (int i=0;i<n-1;i++)
for (int j=i+1;j<n;j++)
if (data[i]<data[j])

int t=data[i]; // 交换
data[i]=data[j];
data[j]=t;


你可以调用此子程序
参考技术B e ,刚刚错了,晕

C++里关于list的排序算法

有这样一个结构:
struct Test

CString Name;
int order;
;

声明一个list来保存结构.
list<Test> testList;
对list赋值:

Test te;
te.Name = "AAA";
te.order = 1;
testList.push_back(te);
te.Name = "BBB";
te.order = 3;
testList.push_back(te);
te.Name = "CCC";
te.order = 2;
testList.push_back(te);
te.Name = "DDD";
te.order = 5;
testList.push_back(te);
te.Name = "EEE";
te.order = 4;
testList.push_back(te);

复制后我想对testList排序,要根据list里面对象的order来排序。
也就是order为1的在list的第一个。2的在第二个。
请问怎么实现。。。 我的QQ:974740

1楼的说法是正确的。
不过,有更方便、更高效的实现方法。
#include <iostream>
#include <list>
#include <string>
using namespace std;

struct Test

string Name;
int order;
;

bool comp(const Test &lhs, const Test &rhs)

return lhs.order < rhs.order;


int main(int argc, char *argv[])

list<Test> testList;
Test te;
te.Name = "AAA";
te.order = 1;
testList.push_back(te);
te.Name = "BBB";
te.order = 3;
testList.push_back(te);
te.Name = "CCC";
te.order = 2;
testList.push_back(te);
te.Name = "DDD";
te.order = 5;
testList.push_back(te);
te.Name = "EEE";
te.order = 4;
testList.push_back(te);

testList.sort(comp);//************

for(list<Test>::const_iterator citer = testList.begin(); citer != testList.end(); ++citer)

cout << citer->Name << "\t" << citer->order << "\n";

cout << endl;

system("pause");
return 0;

一句话实现功能, 且效率更高。
参考技术A 你只要自定义operator < 就可以实现排序了
struct Test

CString Name;
int order;
bool operator < (const Test& t1)
return this->order< t1.order; //具体的比较方法你可以自己改;
;

然后调用泛型算法sort(testList.begin(),testList.end()); 就可以排序了。
当然别忘了加头文件#include <algorithm>
参考技术B 假如你的order对每一个对象来说都是唯一的,即不相同的话.
可以创建一个map<int,Test>和一个list<int>,将里面的order提取出来存放到list<int>里面,用sort()库函数排序,再根据map<int,Test>来查找匹配的对象,根据排序结果,重新对map<int,Test>赋值,这时,对int的排序就完成了对Test的排序,达到了对Test排序目的
参考技术C 1楼高人

以上是关于C++关于最大值排序法中数组无法赋值的问题的主要内容,如果未能解决你的问题,请参考以下文章

关于循环和数组的练习 - 使用循环 1 次以及如何获取数组的最大值

2021-08-21:给定一个数组arr,长度为N > 1,从中间切一刀,保证左部分和右部分都有数字,一共有N-1种切法,如此多的切法中,每一种都有:绝对值(左部分最大值 – 右部分最大值)。返回最大

关于memset的赋值(最大值最小值的选择)

未排序长度 n 数组中 k 个最大元素的索引

C++关于类的,两个题,大一下

215. 数组中的第K个最大元素(c++)