void fnSortCLC(HWND hwnd, ClcData *dat, int useInsertionSort) { ClcGroup *group = &dat->list; if (dat->bNeedsResort) { MCONTACT hSelItem; ClcContact *selcontact; if (cli.pfnGetRowByIndex(dat, dat->selection, &selcontact, NULL) == -1) hSelItem = NULL; else hSelItem = Clist_ContactToHItem(selcontact); group->scanIndex = 0; SortGroup(dat, group, useInsertionSort); for (;;) { if (group->scanIndex == group->cl.getCount()) { if ((group = group->parent) == NULL) break; group->scanIndex++; continue; } ClcContact *cc = group->cl[group->scanIndex]; if (cc->type == CLCIT_GROUP) { group = cc->group; group->scanIndex = 0; SortGroup(dat, group, useInsertionSort); continue; } group->scanIndex++; } if (hSelItem) { ClcGroup *selgroup; if (cli.pfnFindItem(hwnd, dat, hSelItem, &selcontact, &selgroup, NULL)) dat->selection = cli.pfnGetRowsPriorTo(&dat->list, selgroup, selgroup->cl.indexOf(selcontact)); } cli.pfnRecalcScrollBar(hwnd, dat); } dat->bNeedsResort = false; cli.pfnInvalidateRect(hwnd, NULL, FALSE); }
//希尔排序, pnData要排序的数据, nLen数据的个数 int ShellSort(int* pnData, int nLen) { //以nStep分组,nStep每次减为原来的一半。 for (int nStep = nLen / 2; nStep > 0; nStep /= 2) { //对每个组进行排序 for (int i = 0 ;i < nStep; i++) { SortGroup(pnData, nLen, i, nStep); } } return 1; }
void fnSortCLC(HWND hwnd, struct ClcData *dat, int useInsertionSort) { ClcContact *selcontact; ClcGroup *group = &dat->list, *selgroup; MCONTACT hSelItem; if (dat->needsResort) { if (cli.pfnGetRowByIndex(dat, dat->selection, &selcontact, NULL) == -1) hSelItem = NULL; else hSelItem = (UINT_PTR)cli.pfnContactToHItem(selcontact); group->scanIndex = 0; SortGroup(dat, group, useInsertionSort); for (;;) { if (group->scanIndex == group->cl.count) { group = group->parent; if (group == NULL) break; } else if (group->cl.items[group->scanIndex]->type == CLCIT_GROUP) { group = group->cl.items[group->scanIndex]->group; group->scanIndex = 0; SortGroup(dat, group, useInsertionSort); continue; } group->scanIndex++; } if (hSelItem) if (cli.pfnFindItem(hwnd, dat, hSelItem, &selcontact, &selgroup, NULL)) dat->selection = cli.pfnGetRowsPriorTo(&dat->list, selgroup, List_IndexOf((SortedList*)&selgroup->cl, selcontact)); cli.pfnRecalcScrollBar(hwnd, dat); } dat->needsResort = 0; cli.pfnInvalidateRect(hwnd, NULL, FALSE); }
void SortCLC(HWND hwnd,struct ClcData *dat,int useInsertionSort) { struct ClcContact *selcontact; struct ClcGroup *group=&dat->list,*selgroup; int dividers=dat->exStyle&CLS_EX_DIVIDERONOFF; HANDLE hSelItem; int tick=GetTickCount(); if (dat->NeedResort==1 &&1) { if(GetRowByIndex(dat,dat->selection,&selcontact,NULL)==-1) hSelItem=NULL; else hSelItem=ContactToHItem(selcontact); group->scanIndex=0; SortGroup(dat,group,useInsertionSort); for(;;) { if(group->scanIndex==group->contactCount) { group=group->parent; if(group==NULL) break; } else if(group->contact[group->scanIndex].type==CLCIT_GROUP) { group=group->contact[group->scanIndex].group; group->scanIndex=0; SortGroup(dat,group,useInsertionSort); continue; } group->scanIndex++; } ClearClcContactCache(dat,INVALID_HANDLE_VALUE); if(hSelItem) if(FindItem(hwnd,dat,hSelItem,&selcontact,&selgroup,NULL,FALSE)) dat->selection=GetRowsPriorTo(&dat->list,selgroup,selcontact-selgroup->contact); RecalcScrollBar(hwnd,dat); ClearRowByIndexCache(); }else { //TRACE("Not need to sort\r\n"); }; InvalidateRectZ(hwnd,NULL,FALSE); dat->NeedResort=0; // LOCK_IMAGE_UPDATING=1; // RecalcScrollBar(hwnd,dat); #ifdef _DEBUG tick=GetTickCount()-tick; { char buf[255]; //sprintf(buf,"%s %s took %i ms",__FILE__,__LINE__,tick); if (tick>5) { sprintf(buf,"SortCLC %d \r\n",tick); TRACE(buf); DBWriteContactSettingDword((HANDLE)0,"CLUI","PF:Last SortCLC Time:",tick); } } #endif }