// 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]left) j--; if(i <= j) { //交换i, j 的值 t = data[i]; data[i] = data[j]; data[j] = t; i++;j--; } }while(i<=j); if(leftm && idata[j] && j>left) j--; if(i<=j) { t=data[i]; data[i]=data[j]; data[j]=t; i++;j--; } }while(i<=j); if(left 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; }