闲来无事,放分 + 算法(CListCtrl的排序算法)。

vcPlayer 2007-08-17 02:44:46
加班了两个月,好不容易轻松下来。来和大家讨论一下今天用CListCtrl的小发现:

对列表控件中的项目进行排序。10条记录用“冒泡”的话要做45次比较;但CListCtrl只做了22次(根据我的数据测试),疑似“二分”法快排! 正在分析它的算法细节。有兴趣或知情的朋友能否说说你们的看法?

呵呵,祝大家周末愉快。
...全文
1106 62 打赏 收藏 转发到动态 举报
写回复
用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)

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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