搜集了几个常用的排序算法:如直接插入排序,折半插入排序,希尔排序,起泡排序,快速排序,选择排序,堆排序,主要参照《数据结构(C语言版)》
#define MAXSIZE 100
template<class T>
class CSortArithmethic
{
public:
static struct _tagSqList
{
T r[MAXSIZE];
int length;
};
private:
typedef _tagSqList SqList;
public:
// 直接插入排序
static void InsertSort(SqList& l);
// 折半插入排序
static void BInsertSort(SqList& l);
//希尔排序
static void ShellSort(SqList& l,int dlta[],int n);
// 起泡排序
static void BubbleSort(SqList& l);
// 快速排序
static void QuickSort(SqList& l);
// 选择排序
static void SelectSort(SqList& l);
// 堆排序
static void HeadSort(SqList& l); //采用顺序表存储表示
static void swapT(T& t1,T& t2);
private:
static void shellInsert(SqList& l,int dk);
static void qSort(SqList& l,int low,int high);
};
template<class T>
void CSortArithmethic<T>::InsertSort(SqList& l)
{
T tTemp;
int j=0;
for(int i=1;i<l.length;i++)
{
if(l.r[i] <l.r[i-1])
{
tTemp = l.r[i];
for(j= i-1;j>=0&&tTemp <= l.r[j]; --j)
{
l.r[j+1] = l.r[j];
}
l.r[j+1] = tTemp;
}
}
}
template<class T>
void CSortArithmethic<T>::BInsertSort(SqList& l)
{
T tTemp;
int low,high;
int mid;
int j=0;
for(int i=1;i<=l.length;i++)
{
tTemp = l.r[i];
low = 0;high = i - 1;
while(low<high)
{
mid = (low + high) / 2;
if(tTemp <= l.r[mid]) high = mid -1;
else low = mid +1;
}
for( j = i-1;j>=high+1; --j)
l.r[j+1] = l.r[j];
l.r[high+1] = tTemp;
}
}
template<class T>
void CSortArithmethic<T>::shellInsert(SqList& l,int dk)
{
int i=0;
int j=0;
T temp;
for(i = dk;i<l.length;++i)
{
if(l.r[i] < l.r[i - dk])
{
temp = l.r[i];
for(j = i-dk; j>0&&(temp<l.r[j]);j-=dk)
{
l.r[j+dk] = l.r[j];
}
l.r[j+ dk] = temp;
}
}
}
template<class T>
void CSortArithmethic<T>::ShellSort(SqList& l,int dlta[],int n)
{
for(int i=0;i<n;i++)
shellInsert(l,dlta[i]);
}
template<class T>
void CSortArithmethic<T>::BubbleSort(SqList& l)
{
for(int i= l.length;i>=0;i--)
{
for(int j=0;j<i-1;j++)
{
if(l.r[j+1] < l.r[j])
swapT(l.r[j],l.r[j+1]);
}
}
}
template<class T>
void CSortArithmethic<T>::swapT(T& t1,T& t2)
{
T temp = t2;
t2 =t1;
t1 =temp;
}
template<class T>
void CSortArithmethic<T>::qSort(SqList& l,int low,int high)
{
int i,j;
int middle;
i = low;
j = high;
T temp = l.r[(low+high)/2];
do{
while((l.r[i]<temp) && (i<high))
i++;
while((l.r[j]>temp) && (j>low))
j--;
if(i<=j)
{
swapT(l.r[i],l.r[j]);
i++;
j--;
}
}while(i<=j);
if(low<j)
qSort(l,low,j);
if(high>i)
qSort(l,i,high);
}
template<class T>
void CSortArithmethic<T>::QuickSort(SqList& l)
{
qSort(l,0,l.length-1);
}
template<class T>
void CSortArithmethic<T>::SelectSort(SqList& l)
{
int smallIndex;
int i,j;
for(i=0;i<l.length;i++)
{
smallIndex = i;
for(j=i+1;j<l.length;j++)
{
if(l.r[smallIndex] > l.r[j])
smallIndex =j;
}
swapT(l.r[i],l.r[smallIndex]);
}
}
template<class T>
void CSortArithmethic<T>::HeadSort(SqList& l)
{
for(int i=(l.length-1) /2 ; i>=0; i--)
{
T rc = l.r[i];
for(int j=2 * i;j<= l.length-1; j *= 2)
{
if(j< l.length && (l.r[j] < l.r[j+1])) j++;
if( rc >= l.r[j]) break;
l.r[i] = l.r[j];
i = j;
}
l.r[i] = rc;
}
for( i = l.length-1; i>0;i--)
{
swapT(l.r[0],l.r[i]);
T r = l.r[i];
for(int j=2 * i;j<= l.length-1; j *= 2)
{
if(j< l.length && (l.r[j] < l.r[j+1])) j++;
if( r >= l.r[j]) break;
l.r[i] = l.r[j];
i = j;
}
l.r[i] = r;
}
}
/*
************************************************
综合比较各种内部排序方法,大致结果如下
排序方法 平均时间 最坏情况 辅助存储
简单排序 O(n*n) O(n*n) O(1)
快速排序 O(nlogn) O(n*n) O(logn)
堆排序 O(nlogn) O(nlogn) O(1)
************************************************
*/
/*
*************************************************************************************************
TEST
*************************************************************************************************
*/
int _tmain(int argc, _TCHAR* argv[])
{
cout<<"\nSortArithmetic--------------------------------"<<endl;
CSortArithmethic<int>::_tagSqList list;
for(int i=0;i<MAXSIZE;i++)
{
list.r[i] = i *rand()% MAXSIZE;
}
list.length = 100;
cout<<" befor sort"<<endl;
for(i=0;i<list.length;i++)
cout<<list.r[i]<<endl;
cout<<" after sort"<<endl;
CSortArithmethic<int>::QuickSort(list);
for(i=0;i<list.length;i++)
cout<<list.r[i]<<endl;
}
本文地址:http://com.8s8s.com/it/it25131.htm