对大量数据排序(100万个),冒泡法、选择法等排序方法,哪种最快、效率最高?

GZCPFR 2007-12-11 08:42:20
1、在数据完全无序的情况下,哪种最快?

2、在大部分数据有序的情况下,哪种最快?

请教各位,谢谢!
...全文
3623 29 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
margare_wang 2010-09-12
  • 打赏
  • 举报
回复
这么大的数据是怎么读取的啊,我现在要读取一个1000*1000的二维数组,读完后调用的时候内存占用到3G程序就运行不下去了
zhou87feng 2009-11-13
  • 打赏
  • 举报
回复
没有人来总结嘛,有个总结就好了,现在有点乱。
fjye 2007-12-15
  • 打赏
  • 举报
回复
可以试一下stl的stable_sort

示例代码

//---------------------------------------------------------------------------
void TForm1::sort(AnsiString filename)
{
vector< student> vect;
student st1(0, "");

TStringList *pList1,*pList2;
pList1 = new TStringList;
pList2 = new TStringList;
pList2->Delimiter = ',';
pList1->LoadFromFile(filename);

vect.clear();
for(int i=0;i<pList1->Count;i++)
{
pList2->DelimitedText = pList1->Strings[i];
st1.name=StrToInt(pList2->Strings[0]);
st1.score=pList2->Strings[1].c_str();
vect.push_back(st1);
}
stable_sort(vect.begin(), vect.end(),less<student>());

pList1->Clear();

for(int i=0;i<vect.size();i++)
{
pList1->Add(IntToStr(vect[i].name)+","+AnsiString(vect[i].score.begin()));
//ShowMessage(AnsiString(vect[i].name.begin())+","+AnsiString(vect[i].score.begin()));
}

pList1->SaveToFile(filename);
delete pList1;
delete pList2;
}


部分h文件
#include <algorithm>
#include <functional>
#include <vector>
#include <string>
using namespace std;
class student{
public:
student(const int &a, const string b):name(a), score(b){}
int name;
string score;
bool operator < (const student &m)const {
return name< m.name;
}
};
  • 打赏
  • 举报
回复
建议使用快速排序或堆排序。
如果在外存储器中,可使用归并排序。
EagleFew 2007-12-14
  • 打赏
  • 举报
回复
如果部分有序可以考虑使用插入排序,或者归并
EagleFew 2007-12-14
  • 打赏
  • 举报
回复
但是快速排序有一个栈的问题.如果数据再多的话,要防止栈溢出!

基本上快速排序是比较快的.也可以考虑一下Shell排序.

还有一点,如果你的数据是基本有序或者部分有序,不要使用快速排序,不然这种排序的速度跟冒泡排序没有什么区别
cczlp 2007-12-14
  • 打赏
  • 举报
回复
建议lz用qsort和std::sort比较一下, 看看有没有差别.

void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );

Routine Required Header Compatibility
qsort <stdlib.h> and <search.h> ANSI, Win 95, Win NT
laowang2 2007-12-14
  • 打赏
  • 举报
回复
stl
过客猫2022 2007-12-13
  • 打赏
  • 举报
回复
用快速排序就可以了!
cczlp 2007-12-11
  • 打赏
  • 举报
回复
qsort
ydlchina 2007-12-11
  • 打赏
  • 举报
回复
使用数据组件(例如ADO、BDE、dbExpress)读取数据后,就直接读入内存中,不存在另外读取的方法,存在Data中,它是一个Variant类型。
GZCPFR 2007-12-11
  • 打赏
  • 举报
回复
那么也可以把文件分成10个,每个10万行,应该差不多了。StringGrid可以容纳下,滚动也很流畅,就是第一次读入比较慢。

问题是我该怎么把这10万行数据读入内存呢,定义数组吗?有没有其它办法,比如有人提到StringList,但是我不知道怎么用?效果如何?

谢谢大家。
i_love_pc 2007-12-11
  • 打赏
  • 举报
回复
100万行的数据别说排序,就是读取也是个问题!能否放到StringGrid,即使放得能否滚动查看?
建议每次读取部分数据,比如按行读取,指定一个索引值,判断第2列数是否和索引对应,如果对应就读入并写入到StringGrid里。
ydlchina 2007-12-11
  • 打赏
  • 举报
回复

目前排列最快的是索引排序(大牛们都这样说的)。
另外俺知道两种排序方法
1,就是对数据库直接排序。可以使用sql语句对后端数据排序。使用这种方法我觉得对你那两种情况都一样。
2,分段读取后端的数据,然后利用DataSet(BCB的牛技术)一类控件的Data属性。首先判断Data中的数据是否已经排序 如果没有排序就排序,然后再读下一段数据,再判断,以此类推。
那种更快,这得根据实际情况,都有优缺点。
蒋晟 2007-12-11
  • 打赏
  • 举报
回复
放数据库之后排吧
数据库使用的算法比较优化
蒋晟 2007-12-11
  • 打赏
  • 举报
回复
冒泡法本来就是低效算法
GZCPFR 2007-12-11
  • 打赏
  • 举报
回复
数据本来是在一个文件里,文件的格式如下(约100万行):

A,112,B
A,323,B
A,173,B
A,673,B
A,195,B
A,999,B
A,564,B

我想用第二列数据进行升序排列,把排序后结果写到StringGrid里去。

如果申请数组存储后再排序,好象数组也申请的太大了。StringGrid也没有排序功能,有没有什么好办法解决?记得以前看到有人说把数据读入到StringList里面进行排序,不太懂什么意思,请大家指导!谢谢!
Y___Y 2007-12-11
  • 打赏
  • 举报
回复
1.快速排序 比其他优越,也可以分段后归并
2.归并排序应该较好
i_love_pc 2007-12-11
  • 打赏
  • 举报
回复
数据是存在哪里的?内存中,文件中,还是数据库中?
僵哥 2007-12-11
  • 打赏
  • 举报
回复
首先,如此庞大的数据,算法需要考虑存储空间和内存等问题。比如分段排序。
另外,建议把问题发到C/C++版块。
加载更多回复(9)

13,871

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧