SSPC-Tester/Driver/PCIE8586/Samples/VC/Advanced/QSortData.cpp

216 lines
4.3 KiB
C++
Raw Normal View History

// 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;
}