社区
图形处理/算法
帖子详情
闲来无事,放分 + 算法(CListCtrl的排序算法)。
vcPlayer
2007-08-17 02:44:46
加班了两个月,好不容易轻松下来。来和大家讨论一下今天用CListCtrl的小发现:
对列表控件中的项目进行排序。10条记录用“冒泡”的话要做45次比较;但CListCtrl只做了22次(根据我的数据测试),疑似“二分”法快排! 正在分析它的算法细节。有兴趣或知情的朋友能否说说你们的看法?
呵呵,祝大家周末愉快。
...全文
1106
62
打赏
收藏
闲来无事,放分 + 算法(CListCtrl的排序算法)。
加班了两个月,好不容易轻松下来。来和大家讨论一下今天用CListCtrl的小发现: 对列表控件中的项目进行排序。10条记录用“冒泡”的话要做45次比较;但CListCtrl只做了22次(根据我的数据测试),疑似“二分”法快排! 正在分析它的算法细节。有兴趣或知情的朋友能否说说你们的看法? 呵呵,祝大家周末愉快。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
62 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
qqhurt
2007-10-26
打赏
举报
回复
学习
mumuniuniu
2007-08-26
打赏
举报
回复
好东西,学了好多
dovelee
2007-08-23
打赏
举报
回复
jf
xuxingok
2007-08-23
打赏
举报
回复
mark
vcPlayer
2007-08-23
打赏
举报
回复
打烊了,谢谢各位光顾寒店。尤其是codewarrior(会思考的草)还带来了那么多美味。。。。
希望以后蔽人开的小店也能得到各位客倌的支持。
sparkkendy
2007-08-21
打赏
举报
回复
学学学,接接接
hohoxcn
2007-08-21
打赏
举报
回复
路过,学习
lei001
2007-08-20
打赏
举报
回复
mark
corn8888
2007-08-20
打赏
举报
回复
mark
lyg_zy
2007-08-20
打赏
举报
回复
mark
会思考的草
2007-08-20
打赏
举报
回复
lz你要看先进的东西不应该看这里。微软不会拿一个小小的列表控件当新技术试验田,在这里想掏到什么前端科技是缘木求鱼了。数据库里的排序要复杂的多,而且也不是内排序。
owenhui10
2007-08-20
打赏
举报
回复
JF
GOOD LUCK!
emptyness
2007-08-19
打赏
举报
回复
接分愉快..
蒋晟
2007-08-19
打赏
举报
回复
有必要在用户界面层讲究排序性能么?数据量大的话我都是直接上数据库取排好了的数据
oakfire
2007-08-19
打赏
举报
回复
mark.sorry.
vcPlayer
2007-08-19
打赏
举报
回复
有必要在用户界面层讲究排序性能么?数据量大的话我都是直接上数据库取排好了的数据
==========================================================================
这个也不尽然吧?况且我的初衷是想从MS的产品中借鉴一下一些先进的东西(比如这个帖子提到的算法)。这种基础性的东西,即使在数据库的排序中也会用到。
基础性的东西应该有自己的看法,至于用不用,什么场不是合用就是另一个话题了:)。
Avoid
2007-08-19
打赏
举报
回复
一般都用二分法。。。
.Net平台上很多排序都是用二分法(参见msdn)
jhs1982419
2007-08-18
打赏
举报
回复
我自己封装的个类,发给你哈.
CSortList::CSortList(CImageRetrievalView* pv)
{
m_bAsc= TRUE;
//this->m_nSortedCol = -1;
CreateSortIcons();
//GetHeaderCtrl()->SetImageList(&m_imglstSortIcons);
pView = pv;
}
CSortList::~CSortList(void)
{
m_imglstSortIcons.DeleteImageList();
m_bmpUpArrow.DeleteObject();
m_bmpDownArrow.DeleteObject();
}
//IMPLEMENT_DYNCREATE(CsercurityView, CFormView)
BEGIN_MESSAGE_MAP(CSortList, CListCtrl)
ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, OnLvnColumnclick)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSortList message handlers
void CSortList::OnLvnColumnclick(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMListView = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
// TODO: Add your control notification handler code here
//NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
if( pNMListView->iSubItem == m_nSortedCol )
m_bAsc = !m_bAsc;
else
{
m_bAsc = FALSE;
m_nSortedCol = pNMListView->iSubItem;
}
SortItems( ListCompare, (DWORD)this );
SetSortIcon();
for (int i=0;i<this->GetItemCount();i++)
this->SetItemData(i, i);
pView->Invalidate();
*pResult = 0;
}
void CSortList::CreateSortIcons()
{
if (!m_imglstSortIcons.m_hImageList)
{
COLORMAP cm = {RGB(0, 0, 0), GetSysColor(COLOR_GRAYTEXT)};
m_imglstSortIcons.Create (9, 5, ILC_COLOR24 | ILC_MASK, 2, 0);
m_bmpUpArrow.LoadMappedBitmap(IDB_HDRUP, 0, &cm, 1);
m_nUpArrow = m_imglstSortIcons.Add(&m_bmpUpArrow, RGB(255, 255, 255));
m_bmpDownArrow.LoadMappedBitmap(IDB_HDRDOWN, 0, &cm, 1);
m_nDownArrow = m_imglstSortIcons.Add(&m_bmpDownArrow, RGB(255, 255, 255));
}
}
void CSortList::SetSortIcon()
{
CHeaderCtrl* pHeaderCtrl = this->GetHeaderCtrl();
ASSERT(pHeaderCtrl);
pHeaderCtrl->SetImageList(&m_imglstSortIcons);
for( int col = 0; col< GetHeaderCtrl()->GetItemCount(); col++ )
{
HDITEM hdrItem = { 0,};
hdrItem.mask = HDI_FORMAT | HDI_IMAGE;
BOOL ret = pHeaderCtrl->GetItem(col-1, &hdrItem);
ret = pHeaderCtrl->GetItem(col+1, &hdrItem);
ret = pHeaderCtrl->GetItem(col, &hdrItem);
if ( m_nSortedCol == col)
{
hdrItem.fmt = hdrItem.fmt & HDF_JUSTIFYMASK | HDF_IMAGE | HDF_STRING | HDF_BITMAP_ON_RIGHT;
if( m_bAsc )
hdrItem.iImage = m_nUpArrow;
else
hdrItem.iImage = m_nDownArrow;
}
else
{
hdrItem.fmt = hdrItem.fmt & HDF_JUSTIFYMASK | HDF_STRING;
}
pHeaderCtrl->SetItem(col, &hdrItem);
}
}
bool CSortList::GetFullRowSelect()
{
return ( GetExtendedStyle()&LVS_EX_FULLROWSELECT) == LVS_EX_FULLROWSELECT;
}
void CSortList::SetFullRowSelect( bool bFullRowSelect )
{
if( bFullRowSelect )
SetExtendedStyle( GetExtendedStyle()|LVS_EX_FULLROWSELECT );
else
SetExtendedStyle( GetExtendedStyle()&(~LVS_EX_FULLROWSELECT) );
}
bool CSortList::GetGridLines()
{
return ( GetExtendedStyle() & LVS_EX_GRIDLINES ) == LVS_EX_GRIDLINES;
}
void CSortList::SetGridLines( bool bGridLines )
{
if( bGridLines )
SetExtendedStyle( GetExtendedStyle()|LVS_EX_GRIDLINES );
else
SetExtendedStyle( GetExtendedStyle()&(~LVS_EX_GRIDLINES) );
}
int CALLBACK CSortList::ListCompare(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
CSortList* pList=(CSortList*)lParamSort;
int nItem1, nItem2;
LVFINDINFO FindInfo;
FindInfo.flags = LVFI_PARAM; // 指定查找方式
FindInfo.lParam = lParam1;
nItem1 = pList->FindItem(&FindInfo, -1); // 得到对应Item索引
FindInfo.lParam = lParam2;
nItem2 = pList->FindItem(&FindInfo, -1);
if((nItem1 == -1) || (nItem2 == -1))
{
TRACE("无法找到!\n");
return 0;
}
CString Str1,Str2;
Str1 = pList->GetItemText(nItem1, pList->m_nSortedCol); // 得到排序列的Text
Str2 = pList->GetItemText(nItem2, pList->m_nSortedCol);
int iCompRes = 0;
if(Str1 > Str2)
iCompRes = 1;
else if(Str1 == Str2)
iCompRes = 0;
else
iCompRes = -1;
if(pList->m_bAsc)
return iCompRes;
else
return iCompRes*-1;
return 0;
}
ribut9225
2007-08-18
打赏
举报
回复
学习了
kaiy_ai
2007-08-18
打赏
举报
回复
mark too!
加载更多回复(42)
数据库编程总结
当前各种主流数据库有很多,包括Oracle, MS SQL Server, Sybase, Informix, MySQL, DB2, Interbase / Firebird, PostgreSQL, SQLite, SAP/DB, TimesTen, MS ACCESS等等。数据库编程是对数据库的创建、读写等一列的操作。数据库编程分为数据库客户端编程与数据库服务器端编程。数据库客户端编程主要使
数据库编程
当前各种主流数据库有很多,包括Oracle,MS SQL Server, Sybase, Informix, MySQL, DB2, Interbase / Firebird, PostgreSQL,SQLite, SAP/DB, TimesTen, MS ACCESS等等。数据库编程是对数据库的创建、读写等一列的操作。数据库编程分为数据库客户端编程与数据库服务器端编程。数据库客户端编程主要使用O
【转】数据库编程总结
from: http://blog.csdn.net/byxdaz/archive/2010/04/11/5473557.aspx当前各种主流数据库有很多,包括Oracle, MS SQL Server, Sybase, Informix, MySQL, DB2, Interbase / Firebird, PostgreSQL, SQLite, SAP/DB, TimesTen, M
数据库
数据库编程总结 收藏 此文于2010-04-12被推荐到CSDN首页此文于2010-04-16被推荐到CSDN首页如何被推荐?数据库编程总结当前各种主流数据库有很多,包括Oracle, MS SQL Server, Sybase, Informix, MySQL, DB2, Interbase / Firebird, PostgreSQL, SQLite, SAP/DB, TimesTen
数据库编程总结[转载 深之JohnChen的专栏]
数据库编程总结当前各种主流数据库有很多,包括Oracle, MS SQL Server, Sybase, Informix, MySQL, DB2, Interbase / Firebird, PostgreSQL, SQLite, SAP/DB, TimesTen, MS ACCESS等等。数据库编程是对数据库的创建、读写等一列的操作。数据库编程分为数据库客户端编程与数据库服务器端编程。数据
图形处理/算法
19,468
社区成员
50,698
社区内容
发帖
与我相关
我的任务
图形处理/算法
VC/MFC 图形处理/算法
复制链接
扫一扫
分享
社区描述
VC/MFC 图形处理/算法
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章