216 lines
4.3 KiB
C++
216 lines
4.3 KiB
C++
|
|
// QSortData.cpp: implementation of the CQSortData class.
|
|||
|
|
//////////////////////////////////////////////////////////////////////
|
|||
|
|
//*******************************************************************
|
|||
|
|
//
|
|||
|
|
// QSortData<74><61><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>˵<EFBFBD><CBB5><EFBFBD><EFBFBD>
|
|||
|
|
// <20>ܹ<EFBFBD><DCB9><EFBFBD>SHORTָ<54><D6B8>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƚ<EFBFBD><C8BD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>ȵ<EFBFBD><C8B5><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD><D0BC><EFBFBD>(<28><><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
|||
|
|
// ԭ<>ͣ<EFBFBD>CQSortData::Sort(SHORT *data, int left, int right)
|
|||
|
|
//
|
|||
|
|
//*******************************************************************
|
|||
|
|
#include "stdafx.h"
|
|||
|
|
#include "QSortData.h"
|
|||
|
|
|
|||
|
|
#ifdef _DEBUG
|
|||
|
|
#undef THIS_FILE
|
|||
|
|
static char THIS_FILE[]=__FILE__;
|
|||
|
|
#define new DEBUG_NEW
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
//////////////////////////////////////////////////////////////////////
|
|||
|
|
// Construction/Destruction
|
|||
|
|
//////////////////////////////////////////////////////////////////////
|
|||
|
|
CQSortData::CQSortData()
|
|||
|
|
{
|
|||
|
|
m_SortDir = 0; // <20><><EFBFBD><EFBFBD>
|
|||
|
|
m_DataMiddle.Value = 0;
|
|||
|
|
m_DataMiddle.CountNum = 0;
|
|||
|
|
m_DataTypes = 1;
|
|||
|
|
m_bNewData = FALSE;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CQSortData::~CQSortData()
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int CQSortData::GetMaxData() // ȡ<><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
if(m_bNewData)
|
|||
|
|
{
|
|||
|
|
ProcessData();
|
|||
|
|
m_bNewData = FALSE;
|
|||
|
|
}
|
|||
|
|
return m_DataMax;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int CQSortData::GetMinData() // ȡ<><C8A1>С<EFBFBD><D0A1>
|
|||
|
|
{
|
|||
|
|
if(m_bNewData)
|
|||
|
|
{
|
|||
|
|
ProcessData();
|
|||
|
|
m_bNewData = FALSE;
|
|||
|
|
}
|
|||
|
|
return m_DataMin;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int CQSortData::GetMidData() // ȡ<>м<EFBFBD><D0BC><EFBFBD>
|
|||
|
|
{
|
|||
|
|
if(m_bNewData)
|
|||
|
|
{
|
|||
|
|
ProcessData();
|
|||
|
|
m_bNewData = FALSE;
|
|||
|
|
}
|
|||
|
|
return m_DataMiddle.Value;
|
|||
|
|
}
|
|||
|
|
int CQSortData::GetMidDataCount()
|
|||
|
|
{
|
|||
|
|
if(m_bNewData)
|
|||
|
|
{
|
|||
|
|
ProcessData();
|
|||
|
|
m_bNewData = FALSE;
|
|||
|
|
}
|
|||
|
|
return m_DataMiddle.CountNum;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int CQSortData::GetDataTypes() // <20><><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
if(m_bNewData)
|
|||
|
|
{
|
|||
|
|
ProcessData();
|
|||
|
|
m_bNewData = FALSE;
|
|||
|
|
}
|
|||
|
|
return m_DataTypes;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int CQSortData::GetSortDir() // ȡ<><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
|||
|
|
{
|
|||
|
|
return m_SortDir;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CQSortData::SetSortDir(int nDir) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(ȱʡΪ =0<><30><EFBFBD><EFBFBD>)
|
|||
|
|
{
|
|||
|
|
m_SortDir = nDir;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#################################################################
|
|||
|
|
// <20><>dataָ<61><D6B8>ָ<EFBFBD><D6B8><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>±<EFBFBD>Ϊleft<66><74>right<68><74>Ԫ<EFBFBD>ؽ<EFBFBD><D8BD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
void CQSortData::SortAsc(LONG *data, int left, int right)
|
|||
|
|
{
|
|||
|
|
register int i,j;
|
|||
|
|
LONG m,t;
|
|||
|
|
i=left;j=right;
|
|||
|
|
m=data[(int)(left+right)/2];
|
|||
|
|
|
|||
|
|
do{
|
|||
|
|
while(data[i]<m && i<right)
|
|||
|
|
i++;
|
|||
|
|
while(m<data[j] && j>left)
|
|||
|
|
j--;
|
|||
|
|
if(i <= j) { //<2F><><EFBFBD><EFBFBD>i, j <20><>ֵ
|
|||
|
|
t = data[i];
|
|||
|
|
data[i] = data[j];
|
|||
|
|
data[j] = t;
|
|||
|
|
i++;j--;
|
|||
|
|
}
|
|||
|
|
}while(i<=j);
|
|||
|
|
if(left<j) SortAsc(data,left,j);
|
|||
|
|
if(i<right) SortAsc(data,i,right);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#################################################################
|
|||
|
|
// <20><>dataָ<61><D6B8>ָ<EFBFBD><D6B8><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>±<EFBFBD>Ϊleft<66><74>right<68><74>Ԫ<EFBFBD>ؽ<EFBFBD><D8BD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
void CQSortData::SortDsc(LONG *data, int left, int right)
|
|||
|
|
{
|
|||
|
|
register int i,j;
|
|||
|
|
LONG m,t;
|
|||
|
|
i=left;j=right;
|
|||
|
|
m=data[(int)(left+right)/2];
|
|||
|
|
|
|||
|
|
do{
|
|||
|
|
while(data[i]>m && i<right)
|
|||
|
|
i++;
|
|||
|
|
while(m>data[j] && j>left)
|
|||
|
|
j--;
|
|||
|
|
if(i<=j) {
|
|||
|
|
t=data[i];
|
|||
|
|
data[i]=data[j];
|
|||
|
|
data[j]=t;
|
|||
|
|
i++;j--;
|
|||
|
|
}
|
|||
|
|
}while(i<=j);
|
|||
|
|
if(left<j) SortDsc(data,left,j);
|
|||
|
|
if(i<right) SortDsc(data,i,right);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//############################################################
|
|||
|
|
//
|
|||
|
|
void CQSortData::Sort(LONG *data, int left, int right)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
if(!m_SortDir)
|
|||
|
|
{
|
|||
|
|
SortAsc(data, left, right); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(ʡȱ)
|
|||
|
|
m_DataMin = data[left];
|
|||
|
|
m_DataMax = data[right];
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
SortDsc(data, left, right); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
m_DataMin = data[right];
|
|||
|
|
m_DataMax = data[left];
|
|||
|
|
}
|
|||
|
|
m_bNewData = TRUE;
|
|||
|
|
nBufferSize = right - left;
|
|||
|
|
Buffer = data; // <20><>ָ<EFBFBD><D6B8>data<74><61>ֵ<EFBFBD><D6B5><EFBFBD>ݸ<EFBFBD>Bufferָ<72><D6B8>
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//#################################################################
|
|||
|
|
// <20><>Result<6C><74><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD><EFBFBD>м<EFBFBD><D0BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
void CQSortData::ProcessData(void)
|
|||
|
|
{
|
|||
|
|
Result = new SORT_COUNT[nBufferSize]; // <20><>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʴ<EFBFBD>С<EFBFBD><D0A1><EFBFBD>ڴ<EFBFBD>
|
|||
|
|
Result[0].Value = Buffer[0];
|
|||
|
|
Result[0].CountNum = 0;
|
|||
|
|
m_DataMiddle.CountNum = 0;
|
|||
|
|
m_DataMiddle.Value = Result[0].Value;
|
|||
|
|
int k = 0;
|
|||
|
|
for (int i=0; i<nBufferSize; i++)
|
|||
|
|
{
|
|||
|
|
if (Buffer[i] == Result[k].Value)
|
|||
|
|
{
|
|||
|
|
Result[k].CountNum++; // ͳ<>Ƶڸ<C6B5><DAB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵĴ<D6B5><C4B4><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Result[]<5D><>
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
if(Result[k].CountNum > m_DataMiddle.CountNum )
|
|||
|
|
{
|
|||
|
|
m_DataMiddle.CountNum = Result[k].CountNum ;
|
|||
|
|
m_DataMiddle.Value = Result[k].Value ;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
k++;
|
|||
|
|
Result[k].Value = Buffer[i];
|
|||
|
|
Result[k].CountNum = 1;
|
|||
|
|
m_DataTypes++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if(Result[k].CountNum > m_DataMiddle.CountNum )
|
|||
|
|
{
|
|||
|
|
m_DataMiddle.CountNum = Result[k].CountNum ;
|
|||
|
|
m_DataMiddle.Value = Result[k].Value ;
|
|||
|
|
}
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>м<EFBFBD><D0BC><EFBFBD>
|
|||
|
|
if(m_DataMiddle.CountNum == 1)
|
|||
|
|
{
|
|||
|
|
AfxMessageBox(_T("û<EFBFBD><EFBFBD><EFBFBD>м<EFBFBD><EFBFBD><EFBFBD>"));
|
|||
|
|
m_DataMiddle.CountNum = 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
delete [] Result; // <20>ͷŶ<CDB7>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
|
|||
|
|
Result = NULL;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|