排序

来源:互联网 发布:网络成瘾的危害 编辑:程序博客网 时间:2024/09/21 09:00

typedef int DataType;

template<typename T>
class Sort
{
private:


 static int Partition(T argData[],int sp,int ep);
 //快速排序中调用寻找分治点
 static void shellInsert(T argData[],int dk,long DataLen);
 //希尔排序中调用增量为dk插入排序
 static void mergeInsertSort(T Data[],int DataLen,int PartPoint);
 //归并排序法中调用优化的插入排序


public:

 static void bubbleSort(T Data[],int DataLen);
 //冒泡排序
 static void insertSort(T Data[],int DataLen);
 //直接插入排序
 static void selectionSort(T Data[],int DataLen);
 //简单选择排序
 static void quickSort(T Data[],int sp,int DataLen);
 //快速排序
 static void shellSort(T Data[],int DataLen);
 //希尔排序
 static void mergeSort(T Data[],int DataLen);
 //归并排序法


};

int main()
{
 DataType Data[] = {10,9,8,7,6,5,4,3,2,1,0};

    int DataLen = sizeof(Data)/sizeof(int);

 Sort<DataType>::bubbleSort(Data,DataLen);

 Sort<DataType>::insertSort(Data,DataLen);

 Sort<DataType>::selectionSort(Data,DataLen);

 Sort<DataType>::quickSort(Data,0,DataLen);

 Sort<DataType>::shellSort(Data,DataLen);

 Sort<DataType>::mergeSort(Data,DataLen);

 return 0;
}

template <typename T>
void Sort<T>::bubbleSort(T Data[],int DataLen)
//冒泡排序
{
 T temp;
 for(int i=0 ; i<DataLen ; i++)
 {
  for(int j=0 ; j<DataLen-i ; j++)
  {
   if (Data[j]>Data[j+1])
   {
    temp = Data[j];
    Data[j] = Data[j+1];
    Data[j+1] = temp;
   }
  }
 }
}

template<typename T>
void Sort<T>::insertSort(T Data[],int DataLen)
//直接插入排序
{
 T temp;
 for(int i=1 ; i<DataLen ; i++)
 {
  if(Data[i]<Data[i-1])
  {
   temp = Data[i];
   int j = i;
   do
   {
    Data[j] = Data[j-1];
    j--;
   }while(temp<Data[j] && j>0);
   Data[j] = temp;
  }
 }
}


template<typename T>
void Sort<T>::selectionSort(T Data[],int DataLen)
//简单选择排序
{
 T temp;
 int minIndex;
 for(int i=0 ; i<DataLen ; i++)
 {
  minIndex = i;
  for(int j=i+1 ; j<DataLen ; j++)
  {
   if (Data[minIndex]>Data[j])
   {
    minIndex = j;
   }
  }
  if (minIndex!=i)
  {
   temp = Data[i];
   Data[i] = Data[minIndex];
   Data[minIndex] = temp;
  }
 }
}

template <typename T>
int Sort<T>::Partition(T argData[],int sp,int ep)
{
 int Idx = (ep-sp)/2+sp;
 T pivot = argData[Idx];
 T temp;
 int i = sp - 1;
 int j = ep + 1;
 while(i<j)
 {
  do{i++;}while (argData[i]<pivot);
  do{j--;}while (argData[j]>pivot);
  if(i<j)
  {
   temp = argData[i];
   argData[i] = argData[j];
   argData[j] = temp;
  }
 }
 argData[Idx] = argData[j];
 argData[j] = pivot;
 return j;
}

template <typename T>
void Sort<T>::quickSort(T Data[],int sp, int DataLen)
//快速排序
{
 const int MiniLen = 1;
 if (DataLen<=MiniLen)
 {
 }
 else
 {
  int pivot = Partition(Data,sp,DataLen-1);
  quickSort(Data,0,pivot+1);
  quickSort(Data,pivot+1,DataLen-pivot-1);
 }
}

template <typename T>
void Sort<T>::shellInsert(T argData[],int dk,long DataLen)
{
 T temp;
 for(int i=dk ; i<DataLen ; i++)
 {
  if(argData[i]<argData[i-dk])
  {
   temp = argData[i];
   for(int j=i-dk ; (j>=0)&&(temp<argData[j]) ; j-=dk)
   {
    argData[j+dk] = argData[j];
    argData[j] = temp;
   }
  }
 }
}

template <typename T>
void Sort<T>::shellSort(T Data[],int DataLen)
//希尔排序
{
 if (DataLen<10)
 {
  shellInsert(Data,1,DataLen);
 }
 else
 {
  int dkArray[]={1,2,3,5};
  for(int i=sizeof(dkArray)/sizeof(int)-1 ; i>=0 ; i++)
  {
   shellInsert(Data,dkArray[i],DataLen);
  }
 }
}


template<typename T>
void Sort<T>::mergeInsertSort(T Data[],int DataLen,int PartPoint)
//归并排序中优化的插入排序
{
 int i = PartPoint;
 int j = 0;
 int insertNode = 0;
 T temp;
 while((i<DataLen)&&(j<(PartPoint+insertNode)))
 {
  if(Data[i]>=Data[j]){ j++; }
  else
  {
   //插入
   temp =Data[i];
   for(int k = i ; k>j ; k--)
    Data[k] = Data[k-1];
   Data[j] = temp;
   //
   insertNode++;
   i++;
   j++;
  }
 }
}

template <typename T>
void Sort<T>::mergeSort(T Data[],int DataLen)
//归并排序法
{
 int i=2;
 for( ; i<DataLen ; i*=2)
 {
  for(int j=0 ; j<DataLen ; j+=i)
  {
   mergeInsertSort(&Data[j],(DataLen-j) > i ? i : DataLen-j,i/2);
  }
 }
 mergeInsertSort(Data,DataLen,i/2);
}