算法列表 |
堆排序 |
归并排序 |
基数排序 |
//堆排序
void AdjustDown(SortTable &ST,int i,int len)
{
int j = 0;
ST.elem[0] = ST.elem[i];
for ( j= i * 2;j <= len;j *= 2)
{
if (j <len && ST.elem[j] < ST.elem[j+ 1])//找出堆中最大者
j++;
if (ST.elem[0] > ST.elem[j])break;
else
{
ST.elem[i] = ST.elem[j];
i = j;
}
}
ST.elem[i] = ST.elem[0];
}
void BuildMaxHeap(SortTable &ST)
{
for (int i = ST.length/2;i > 0;--i)
{
AdjustDown(ST, i,ST.length);
}
}
void HeapSort(SortTable ST)
{
BuildMaxHeap(ST);//建堆
for (int i = ST.length;i>1;--i)
{
swap(ST.elem[1], ST.elem[i]);
AdjustDown(ST, 1, i-1);
}
}
/*
归并排序:
核心思想:假定待排序表含有n个记录,则可将其视为n个有序字表
每个字表长度为1,然后两两归并。递归实现
*/
void Merge(SortTable ST,int low,int mid,int high)
{
ElemType *tmp = (ElemType*)malloc(sizeof(ElemType)*(ST.length+1));//代码中编号从1开始,应该多申请一个空间
for (int i = low;i <= high;i++)
tmp[i] = ST.elem[i];
int i = low,j = mid+1;
int k=low;
for (;i <= mid && j <= high;k++)
{
if (tmp[i] <= tmp[j])
ST.elem[k] = tmp[i++];
else
ST.elem[k] = tmp[j++];
}
while (i <= mid ) ST.elem[k++] = tmp[i++];
while (j <= high) ST.elem[k++] = tmp[j++];
free(tmp);
}
void MergeSort(SortTable ST, int low, int high)
{
if (low < high)
{
int mid = (low + high) / 2;
MergeSort(ST, low, mid);
MergeSort(ST, mid+1,high);
Merge(ST, low, mid, high);
}
}
void MergeSort(SortTable ST)
{
MergeSort(ST, 1,ST.length);
}
/*
基数排序
*/
int getBitNum(ElemType e, int n)
{
int i = 0;
while (e)
{
e /= 10;
i++;
}
if (i > n)
return i;
else
return n;
}
void RadixSort(SortTable ST)
{
int bitFlag = 0;
int maxBit = 1;//暂时定为1位,在第一趟后确定出元素中最大到底有几位
SqQueue Q[10];
for(int i=0;i<10;i++)
InitQueue(Q[i]);//初始化队列数组
while (bitFlag <= maxBit)
{
for (int i = 1;i <= ST.length;++i)//一趟基数排序
{
int tmp = ST.elem[i];
if (tmp < 0)return;//不处理负数
maxBit = getBitNum(ST.elem[i], maxBit);//确定元素中最大有几位
if (tmp >= pow(10, bitFlag))
{
for (int j = 0;j < bitFlag;j++)
tmp /= 10;
EnQueue(Q[tmp%10], ST.elem[i]);
}
else
{
EnQueue(Q[0], ST.elem[i]);
}
}
int k = 1;
for (int i = 0;i < 10;i++)
{
while (!QueueEmpty(Q[i]))
{
DeQueue(Q[i], ST.elem[k++]);
}
}
bitFlag++;
}
}