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

216 lines
4.3 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// QSortData.cpp: implementation of the CQSortData class.
//////////////////////////////////////////////////////////////////////
//*******************************************************************
//
// QSortData类的使用说明
// 能够对SHORT指针指向的一组数据先进行指定长度的排序,求出中间数(出现概率最大的数)
// 原型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; // 升序
m_DataMiddle.Value = 0;
m_DataMiddle.CountNum = 0;
m_DataTypes = 1;
m_bNewData = FALSE;
}
CQSortData::~CQSortData()
{
}
int CQSortData::GetMaxData() // 取最大数
{
if(m_bNewData)
{
ProcessData();
m_bNewData = FALSE;
}
return m_DataMax;
}
int CQSortData::GetMinData() // 取最小数
{
if(m_bNewData)
{
ProcessData();
m_bNewData = FALSE;
}
return m_DataMin;
}
int CQSortData::GetMidData() // 取中间数
{
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() // 出现的数据种数
{
if(m_bNewData)
{
ProcessData();
m_bNewData = FALSE;
}
return m_DataTypes;
}
int CQSortData::GetSortDir() // 取得排序方向(升序或降序)
{
return m_SortDir;
}
void CQSortData::SetSortDir(int nDir) // 设置排序方向(缺省为 =0升序)
{
m_SortDir = nDir;
}
//#################################################################
// 对data指针指向的缓冲区从下标为left到right的元素进行 升序排序
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) { //交换i, j 的值
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);
}
//#################################################################
// 对data指针指向的缓冲区从下标为left到right的元素进行 降序排序
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); // 升序排序(省缺)
m_DataMin = data[left];
m_DataMax = data[right];
}
else
{
SortDsc(data, left, right); //降序排序
m_DataMin = data[right];
m_DataMax = data[left];
}
m_bNewData = TRUE;
nBufferSize = right - left;
Buffer = data; // 把指针data的值传递给Buffer指针
}
//#################################################################
// 从Result数组中查找中间数出现频率最大的数
void CQSortData::ProcessData(void)
{
Result = new SORT_COUNT[nBufferSize]; // 动态分配合适大小的内存
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++; // 统计第个数出现的次数, 保存在Result[]中
}
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 ;
}
//如果没有中间数
if(m_DataMiddle.CountNum == 1)
{
AfxMessageBox(_T("没有中间数"));
m_DataMiddle.CountNum = 0;
}
delete [] Result; // 释放动态分配的内存
Result = NULL;
}