设为首页 加入收藏

TOP

排序算法模板实现(二)
2019-03-24 12:08:06 】 浏览:156
Tags:排序 算法 模板 实现
循环则要判别 j - srep < 0的情况

{
this->m_num[j] = this->m_num[j - step];
this->m_num[j - step] = tempNum;
}
}

}
}
step /= 2;
}
return this->m_num;
}
?
//归并
template<class T>
T* CDaXiongTemplateSort<T>::MergeSort(T* num, int size, bool ascending = true)
{


T* lift, *right;
if (size >> 1)
{
lift = new T[size >> 1];
right = new T[size - (size >> 1)];
for (int i = 0, j = 0; i < size; ++i)
{
if (i < size >> 1)
{
lift[i] = num[i];
}
else
{
right[j++] = num[i];
}
}
?
MergeSort(lift, size >> 1, ascending);//排序lift
MergeSort(right, size - (size >> 1), ascending);//排序right
/**************************************************************/
?
/**************************************************************/
?
int i, j, k;
for (i = 0, j = 0, k = 0; i < size >> 1 && j < size - (size >> 1);)
{
if (ascending)             //升序
{
if (lift[i] < right[j])//合并有序
{
num[k++] = lift[i++];
}
else
{
num[k++] = right[j++];
}
}
else//降序
{
if (lift[i] < right[j])//合并有序
{
num[k++] = right[j++];
}
else
{

num[k++] = lift[i++];
}
}

}
//剩余元素全部放回去
if (i >= size >> 1)//说明lift中的内容放完了
{
while (j < size - (size >> 1))
{
num[k++] = right[j++];
}
}
else
{
while (i < size >> 1)
{
num[k++] = lift[i++];
}
}
delete[] lift;
delete[] right;
}
?
return num;
}
?
//桶
template<class T>
T* CDaXiongTemplateSort<T>::BucketSort(int n)
{
T* bucket[11];//声明11个桶,第11个桶用来暂存有序数据
int temp;//临时桶的下标
static int count = 0;
for (int i = 0;i < 11; ++i)
{
bucket[i] = new T[this->m_length];//定义10 * n 的矩阵用做存储数据 n表示需要排序数组的长度
for (int j = 0; j < this->m_length; ++j)
{
bucket[i][j] = MARK;//初始化所有桶元素
}
}

for (int i = 0, k = 1; i < n; ++i, k *= 10)//排序的次数 n 最大值的位数  
{
for (int j = 0; j < this->m_length; ++j)//入桶把数组this->m_num中元素全部倒入桶中
{
if (this->m_num[j] < k * 10 && this->m_num[j] >= k)
{
temp = this->m_num[j] / k % 10;
bucket[temp][j] = this->m_num[j];//放入桶中
}
}
//立刻倒回原来的数组
for (int m = 0, j = 0; m < 10; ++m)
{
for (int x = 0; x < this->m_length; ++x)//数据的个数
{
if (bucket[m][x] != MARK)
{
bucket[10][count++] = bucket[m][x];//倒回桶中
bucket[m][x] = MARK;
}
}
}
}
?
for (int i = 0; i < this->m_length; ++i)
{
this->m_num[i] = bucket[10][i];
}
?
for (int i = 0; i < 11; ++i)
{
delete []bucket[i];
bucket[i] = NULL;
}
return this->m_num;
}
首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇51nod“省选”模测第二场 B 异或.. 下一篇#leetcode刷题之路32-最长有效括号

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目