用户管理  |  用户注册
当前位置:中科软件园教程中心程序设计VC专栏经典算法 → 教程内容

各种排序算法

减小字体 增大字体 作者:不详  来源:本站整理  发布时间:2005-7-21 15:19:56
mp;
    }
  }
}

void main()
{
  int data[] = {10,9,8,7,6,5,4,3,2,1,-10,-1};
  ShellSort(data,12);
  for (int i=0;i<12;i++)
    cout<<data[i]<<" ";
  cout<<"\n";
}
呵呵,程序看起来有些头疼。不过也不是很难,把s==0的块去掉就轻松多了,这里是避免使用0
步长造成程序异常而写的代码。这个代码我认为很值得一看。
这个算法的得名是因为其发明者的名字D.L.SHELL。依照参考资料上的说法:“由于复杂的数学原因
避免使用2的幂次步长,它能降低算法效率。”另外算法的复杂度为n的1.2次幂。同样因为非常复杂并
“超出本书讨论范围”的原因(我也不知道过程),我们只有结果了。


四、基于模板的通用排序:
这个程序我想就没有分析的必要了,大家看一下就可以了。不明白可以在论坛上问。
MyData.h文件
///////////////////////////////////////////////////////
class CMyData 
{
public:
  CMyData(int Index,char* strData);
  CMyData();
  virtual ~CMyData();

  int m_iIndex;
  int GetDataSize(){ return m_iDataSize; };
  const char* GetData(){ return m_strDatamember; };
  //这里重载了操作符:
  CMyData& operator =(CMyData &SrcData);
  bool operator <(CMyData& data );
  bool operator >(CMyData& data );

private:
  char* m_strDatamember;
  int m_iDataSize;
};
////////////////////////////////////////////////////////

MyData.cpp文件
////////////////////////////////////////////////////////
CMyData::CMyData():
m_iIndex(0),
m_iDataSize(0),
m_strDatamember(NULL)
{
}

CMyData::~CMyData()
{
  if(m_strDatamember != NULL)
    delete[] m_strDatamember;
  m_strDatamember = NULL;
}

CMyData::CMyData(int Index,char* strData):
m_iIndex(Index),
m_iDataSize(0),
m_strDatamember(NULL)
{
  m_iDataSize = strlen(strData);
  m_strDatamember = new char[m_iDataSize+1];
  strcpy(m_strDatamember,strData);
}

CMyData& CMyData::operator =(CMyData &SrcData)
{
  m_iIndex = SrcData.m_iIndex;
  m_iDataSize = SrcData.GetDataSize();
  m_strDatamember = new char[m_iDataSize+1];
  strcpy(m_strDatamember,SrcData.GetData());
  return *this;
}

bool CMyData::operator <(CMyData& data )
{
  return m_iIndex<data.m_iIndex;
}

bool CMyData::operator >(CMyData& data )
{
  return m_iIndex>data.m_iIndex;
}
///////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////
//主程序部分
#include <iostream.h>
#include "MyData.h"

template <class T>
void run(T* pData,int left,int right)
{
  int i,j;
  T middle,iTemp;
  i = left;
  j = right;
  //下面的比较都调用我们重载的操作符函数
  middle = pData[(left+right)/2]; //求中间值
  do{
    while((pData[i]<middle) && (i<right))//从左扫描大于中值的数
      i++;     
    while((pData[j]>middle) && (j>left))//从右扫描大于中值的数
      j--;
    if(i<=j)//找到了一对值
    {
      //交换
      iTemp = pData[i];
      pData[i] = pData[j];
      pData[j] = iTemp;
      i++;
      j--;
    }
  }while(i<=j);//如果两边扫描的下标交错,就停止(完成一次)

  //当左边部分有值(left<j),递归左半边
  if(left<j)
    run(pData,left,j);
  //当右边部分有值(right>i),递归右半边
  if(right>i)
    run(pData,i,right);
}

template <class T>
void QuickSort(T* pData,int Count)
{
  run(pData,0,Count-1);
}

void main()
{
  CMyData data[] = {
    CMyData(8,"xulion"),
    CMyData(7,"sanzoo"),
    CMyData(6,"wangjun"),
    CMyData(5,"VCKBASE"),
    CMyData(4,"jacky2000"),
    CMyData(3,"cwally"),
    CMyData(2,"VCUSER"),
    CMyData(1,"isdong")
  };
  QuickSort(data,8);
  for (int i=0;i<8;i++)
    cout<<data[i].m_iIndex<<" "<<data[i].GetData()<<"\n";
  cout<<"\n";
}

最后,希望大家愉快的编程。有什么意见,给我提吧!

上一页  [1] [2] [3]