最近自己用C++写了一个排序类:
#ifndef SORT_H_
#define SORT_H_
#include <iostream>
#include "math.h"
using
namespace
std;
//下面所用到的n都为要排列数组长度;
//first为数组的第一个位置,last为最后一个位置,middle为中间位置
template
<
class
T>
class
Sort {
public
:
Sort();
virtual
~Sort();
int
Max(T a[],
int
n);
//返回最大值所在位置
void
Swap(T& a,T& b);
//交换两个元素
int
Partition(T a[],
int
first,
int
last);
//分区以最后一个数为KEY,返回其所在位置
void
Merge(T a[],
int
first,
int
middle,
int
last);
//合并两个有序数组
void
Output(T a[],
int
n);
//打印数组
void
SelectionSort(T a[],
int
n);
//选择排序
void
BubbleSort(T a[],
int
n);
//冒泡排序
void
InsertionSort(T a[],
int
n);
//插入排序
void
CountSort(T a[],T b[],
int
n);
//计数排序
void
QuickSort(T a[],
int
first,
int
last);
//快速排序
void
MergeSort(T a[],
int
first,
int
last);
//合并排序
void
RadixSort(T a[],
int
n,
int
d);
// 基数排序
};
template
<
class
T>
Sort<T>::Sort() {
// TODO Auto-generated constructor stub
};
template
<
class
T>
Sort<T>::~Sort() {
// TODO Auto-generated destructor stub
};
template
<
class
T>
int
Sort<T>::Max(T a[],
int
n)
{
T max=0;
int
position;
for
(
int
i=0;i<n;i++)
{
if
(max<a[i])
{
position=i;
}
}
return
position;
};
template
<
class
T>
void
Sort<T>::Swap(T& a,T& b)
{
T temp;
temp=a;
a=b;
b=temp;
};
template
<
class
T>
int
Sort<T>::Partition(T a[],
int
first,
int
last)
{
T x=a[last];
int
i=first-1;
int
j;
for
(j=first;j<=last-1;j++)
{
if
(a[j]<=x)
{
i=i+1;
Swap(a[i],a[j]);
}
}
Swap(a[i+1],a[last]);
return
i+1;
};
template
<
class
T>
void
Sort<T>::Merge(T a[],
int
first,
int
middle,
int
last)
{
int
ln=middle-first+1;
int
rn=last-middle;T max=a[Max(a,last+1)];
T L[ln],R[rn];
for
(
int
i=0;i<ln;i++)
L[i]=a[first+i];
for
(
int
j=0;j<rn;j++)
R[j]=a[middle+j+1];
L[ln]=max+1;R[rn]=max+1;
int
i=0,j=0;
for
(
int
k=first;k<=last;k++)
{
if
(L[i]<=R[j])
{
a[k]=L[i];
i++;
}
else
{
a[k]=R[j];
j++;
}
}
};
template
<
class
T>
void
Sort<T>::Output(T a[],
int
n)
{
cout<<
"The order is:"
<<endl;
for
(
int
i=0;i<n;i++)
{
cout<<a[i]<<
"\t"
;
}
cout<<endl;
};
template
<
class
T>
void
Sort<T>::BubbleSort(T a[],
int
n)
{
for
(
int
i=n-1;i>0;i--)
{
for
(
int
j=0;j<i;j++)
{
if
(a[j]>a[j+1])
{
Swap(a[j],a[j+1]);
}
}
}
Output(a,n);
}
template
<
class
T>
void
Sort<T>::SelectionSort(T a[],
int
n)
{
for
(
int
i=n;i>0;i--)
{
Swap(a[Max(a,i)],a[i-1]);
}
Output(a,n);
};
template
<
class
T>
void
Sort<T>::InsertionSort(T a[],
int
n)
{
int
j;
for
(
int
i=1;i<n;i++)
{
T t=a[i];
for
(j=i-1;j>=0&&t<a[j];j--)
{
a[j+1]=a[j];
}
a[j+1]=t;
}
Output(a,n);
};
template
<
class
T>
void
Sort<T>::CountSort(T a[],T b[],
int
n)
{
T k=a[Max(a,n)];T c[k];
for
(
int
i=0;i<=k;i++)
{
c[i]=0;
//初始化
}
for
(
int
j=0;j<n;j++)
{
c[a[j]]=c[a[j]]+1;
//C[i]包含等于i的元素个数
}
for
(
int
i=1;i<=k;i++)
{
c[i]=c[i]+c[i-1];
//C【i】包含的小于或等于i的元素个数
}
for
(
int
j=n-1;j>=0;j--)
{
b[c[a[j]]-1]=a[j];
c[a[j]]=c[a[j]]-1;
}
};
template
<
class
T>
void
Sort<T>::QuickSort(T a[],
int
first,
int
last)
{
if
(first<last)
{
int
q=Partition(a,first,last);
QuickSort(a,first,q-1);
QuickSort(a,q+1,last);
}
};
template
<
class
T>
void
Sort<T>::MergeSort(T a[],
int
first,
int
last)
{
if
(first<last)
{
int
middle=(first+last)/2;
MergeSort(a,first,middle);
MergeSort(a,middle+1,last);
Merge(a,first,middle,last);
}
};
template
<
class
T>
void
Sort<T>::RadixSort(T a[],
int
n,
int
d)
//基数排序,其中d为最高的位数
{
T b[n];
//存放每次按某一位排好后的数;
for
(
int
m=0;m<d;m++)
{
T k=10;
//排列的数最大不超过10,以10为基数;
T c[k];
//存放元素个数
int
x=
pow
(10,m);
//位权
for
(
int
i=0;i<=k;i++)
{
c[i]=0;
//初始化
}
for
(
int
j=0;j<n;j++)
{
c[(a[j]/x)%10]=c[(a[j]/x)%10]+1;
//C[i]包含等于i的元素个数
}
for
(
int
i=1;i<=k;i++)
{
c[i]=c[i]+c[i-1];
//C【i】包含的小于或等于i的元素个数
}
for
(
int
j=n-1;j>=0;j--)
{
b[c[(a[j]/x)%10]-1]=a[j];
//b存放排序好的数组
c[(a[j]/x)%10]=c[(a[j]/x)%10]-1;
//个数减一
}
for
(
int
i=0;i<n;i++)
{
a[i]=b[i];
//每次某位排好后,再赋值给a;
}
}
}
#endif
|
<script type="text/javascript" id="wumiiRelatedItems"> </script>