/*
*@description:冒泡排序算法实现
*@author lintel
*/
void BubbleSort(ElemType A[], int n)
{//冒泡将A中元素升序排
for (int i=0; i<n-1; ++i){
int flag = 0;//本趟交换标识
for (int j=n-1; j>i; --j){//一趟冒泡
if (A[j].key < A[j-1].key){
swap(A[j], A[j-1]);
flag = 1;
}
}
if (flag == 0)//本趟冒泡没有发生交换,表已有序
return ;
}
}
/*
*@description:快排算法实现
*快排基于分治法,取中枢值作划分,一趟partition后中枢值位置定
*表中元素被中枢值一分为二,递归划分两子表
*@author lintel
*/
void QuickSort(ElemType A[], int low, int high)
{
if (low < high){
int pivotpos = Partition(A, low, high);//划分
QuickSort(A, low, pivotpos-1);
QuickSort(A, pivotpos+1, high);
}
}
//快排算法关键在划分操作,以下给出两种划分
int Partition1(ElemType A[], int low, int high)
{
ElemType pivot = A[low];
while (low<high && A[high]>=pivot) --high;
A[low] = A[high];
while (low<high && A[low]<pivot) ++low;
A[high] = A[low];
A[low] = pivor;
return low;
}
int Partition2(ElemType A[], int low, int high)
{
ElemType pivot = A[low];
int i = low;
for (int j=low+1; j<=high; ++j){
if (A[j].key < pivot){
swap(A[++i], A[j]);
}
}
swap(A[i], A[low]);
return i;
}
/*
*@description:插入排序算法实现:直接插,折半插(仅减少比较次数),希尔排
*@author lintel已排后挪,依次插入A[2]~A[n]
*/
void InsertSort(ElemType A[], int n)
{//直接插排A[0]作复制哨兵
for (int i=2; i<=n; ++i)
if (A[i].key < A[i-1].key){
A[0] = A[i];
int j = i-1;
for (; A[0].key<A[j].key; --j)
A[j+1] = A[j];//后移
A[j+1] = A[0];
}//if
}
void InsertSort(ElemType A[], int n)
{//希尔排 分组插排。希尔增量序列每次减半
//和直接插排相比1,前后记录位置的增量是d不是1;2,A[0]是暂存单元
for (int d = len/2; len>=1; len /= 2)//步长变化
for (int i=d+1; i<=n; ++i)
if(A[i].key < A[i-d].key){
A[0] = A[i];
int j=i-d;
for (; j>0&&A[0]<A[j].key; j -= d)
A[j+d] = A[j];//后移
A[j+d] = A[0];
}//if
}
/*
*@description:选择排序算法实现
*第i趟选择最小元素后和第i元交换
*@author lintel
*/
void SelectSort(ElemType A[], int n)
{
for (i=0; i<n-1; ++i){
int min = i;//记录最小元位置
for (int j=i+1; j<n; ++j)
if (A[j] < A[min]) min = j;//更新最小元位置
if (i!=min) swap(A[i], A[min]);
}
}
//堆排见:。。。。。。。。。。
/*
*@description:归并排序算法实现
归并指将两个或两个以上的有序表组合成一个新的有序表。
归并排递归基于分治法,一趟归并为O(n),共需logn趟
*@author lintel
*/
void Merge(ElemType A[], int low, int mid, int high)
{//Merge()将前后两个有序表归并为一个有序表
ElemType *temp = (ElemType*)malloc((n+1)*sizeof(ElemType));
for (int i=low; i<=high; ++i)
temp[i] = A[i];//将待合并表复制到temp中
for (int i=low,j=mid+1,k=i; i<=mid && j<=high; ++k){
if (temp[i]<=temp[j])
A[k] = temp[i++];
else
A[k] = temp[j++];//将两段中较小值赋值到A中
}//for
while (i<=mid) A[k++] = temp[i++];
while (j<=high) A[k++] = temp[j++];//两while执行1个
}
//递归形式的2-路归并
void MergeSort(ElemType A[], int low, int high)
{
if (low<high){
int mid = (low+high)/2;
MergeSort(A, low, mid);
MergeSort(A, mid+1, high);
Merge(A, low, mid, high);
}//if
}
/*
*@description:基数排序算法实现
基数排序不是基于比较,而是根据构成关键字的d个分量的值
借助“分配”和‘“收集”两操作完成单分量的排序
分为最低位优先(LSD)和最高位优先(MSD)
*@author lintel
*/
//r为基数,d为分量元数
void RadixSort(int A[], int n)
{
int d = getMaxBit(A);//获取待排数的最大位数
for (int i=1; i<=d; ++i){
vector<queue<int> > vecq(10,queue<int>);
distribute(A, i, vecq);//分配
collecte(A, vecq);//收集
}
}
void distribute(int A[], int i, vector<queue<int> vecq)
{
//第i趟分配
vector<queue<int> >
for (int j=0; j<n; ++j){
vecq[getIBit(A[j], i)].push(A[j]);
}
}
void collecte(int A[], vector<queue<int> > vecq)
{
int k=0;
for (int i=0; i<10; ++i){
while (!vecq[i].empty()){
A[k++] = vecq[i].front();
vecq[i].pop();
}
}
}
/*
桶排序算法参考http://hxraid.iteye.com/blog/647759
桶排序1关键字桶映射函数f(k),最好将N数据平分到M桶中,尽量增大桶数M
2各桶内快排
*/