关于排序算法

贫道码农 2015-09-14 08:06:38
如果知道快速排序是正确的,其最坏情况为n^2,假设无法确定合并排序对错,其最坏情况为nlogn,求一个正确的排序算法且最坏情况复杂度为nlogn ??(只能利用确定的快速排序算法和不确定的合并算法)。想法:某种策略难道会使得能确定合并排序变成正确的??急求啊 谢谢您们
...全文
273 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
贫道码农 2015-09-29
  • 打赏
  • 举报
回复
引用 6 楼 izsky 的回复:
引用 3 楼 zhao4zhong1 的回复:
稳定性吧
稳定性是针对相同关键值提的吧 有的迷糊。。。难道是我问题听错题目了,好像有点难。
引用 7 楼 zhao4zhong1 的回复:
各种排序算法动画演示http://www.webhek.com/misc/comparison-sort/ <1000个元素,冒泡排序 <100000个元素,qsort函数 <10000000个元素,放数据库中,建索引,(B+树排序) ≥10000000个元素,没用到过。
引用 8 楼 lm_whales 的回复:
排序 算法上讲,一般是这么做的 小用 插入 。小或者基本有序 大用 快排 。快排到数据比较少的时候,换用 插入排序。 外部用 归并 ,涉及到外存 快排平均 O(NlogN) 快排转堆排序, 当递归深度, 达到一定程度的时候, 换用堆排序,可以达到仍然满足 最坏O(NlogN) 的目的, 因为 堆排序是最坏 O(NlogN) 的 归并 O(NlogN) 但是空间 复杂度为 O(N) 改进的原地归并排序,时间为 O(Nlog^2 N ) 空间复杂度 O(1) 归并和快排合并,方法和 快排堆排合并一致 达到某种程度,例如递归深度 快排换成归并即可 大概算法:
 
void Qsort( int a[],int left,int right,int dept,int dept_max=8,const min_elems =10)
{
        if(dept ==dept_max){
        heapSort(a,left,right); //这是堆排和快排的合并,这里换成归并,就完成归并和快排的合并了
        return; 
       } 
       
        if(left+min_elems>= right) {//防止数据太少,达不到递归深度,
          insertSort(a,left,right); 
          return;          
        }
        //下面是标准的快速排序
        int  mid =partion(a,left,right); //快排的核心代码就是这个partion 这里就不写了
        Qsort(a,left,mid-1,dept+1, dept_max);   //额外传递深度和最大深度两个参数
        Qsort(a,mid+1,right,dept+1 ,dept_max);//额外传递深度和最大深度两个参数
}
非常非常感谢大家热心的帮助。先结贴啦。再次感谢。
赵4老师 2015-09-16
  • 打赏
  • 举报
回复
各种排序算法动画演示http://www.webhek.com/misc/comparison-sort/ <1000个元素,冒泡排序 <100000个元素,qsort函数 <10000000个元素,放数据库中,建索引,(B+树排序) ≥10000000个元素,没用到过。
贫道码农 2015-09-16
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
稳定性吧
稳定性是针对相同关键值提的吧 有的迷糊。。。难道是我问题听错题目了,好像有点难。
贫道码农 2015-09-16
  • 打赏
  • 举报
回复
引用 2 楼 ri_aje 的回复:
[quote=引用 楼主 izsky 的回复:] 无法确定合并排序对错
你先解释一下这是什么意思吧?归并排序为啥无法确定对错。[/quote] 额 是假设不能确定对错。一道面试题,没有答出来,不知道答案额。。
贫道码农 2015-09-16
  • 打赏
  • 举报
回复
引用 1 楼 lm_whales 的回复:
快排,转堆排序,可以达到 nlogn
不是很懂您的意思额?快排怎么转换成堆排?题目的意思应该是用确定的快排和不确定的归并排序合成新算法吧?这个是之前有个老师问的面试题,不知道答案是啥。。
lm_whales 2015-09-16
  • 打赏
  • 举报
回复
排序 算法上讲,一般是这么做的 小用 插入 。小或者基本有序 大用 快排 。快排到数据比较少的时候,换用 插入排序。 外部用 归并 ,涉及到外存 快排平均 O(NlogN) 快排转堆排序, 当递归深度, 达到一定程度的时候, 换用堆排序,可以达到仍然满足 最坏O(NlogN) 的目的, 因为 堆排序是最坏 O(NlogN) 的 归并 O(NlogN) 但是空间 复杂度为 O(N) 改进的原地归并排序,时间为 O(Nlog^2 N ) 空间复杂度 O(1) 归并和快排合并,方法和 快排堆排合并一致 达到某种程度,例如递归深度 快排换成归并即可 大概算法:
 
void Qsort( int a[],int left,int right,int dept,int dept_max=8,const min_elems =10)
{
        if(dept ==dept_max){
        heapSort(a,left,right); //这是堆排和快排的合并,这里换成归并,就完成归并和快排的合并了
        return; 
       } 
       
        if(left+min_elems>= right) {//防止数据太少,达不到递归深度,
          insertSort(a,left,right); 
          return;          
        }
        //下面是标准的快速排序
        int  mid =partion(a,left,right); //快排的核心代码就是这个partion 这里就不写了
        Qsort(a,left,mid-1,dept+1, dept_max);   //额外传递深度和最大深度两个参数
        Qsort(a,mid+1,right,dept+1 ,dept_max);//额外传递深度和最大深度两个参数
}
赵4老师 2015-09-15
  • 打赏
  • 举报
回复
稳定性吧
ri_aje 2015-09-15
  • 打赏
  • 举报
回复
引用 楼主 izsky 的回复:
无法确定合并排序对错
你先解释一下这是什么意思吧?归并排序为啥无法确定对错。
lm_whales 2015-09-14
  • 打赏
  • 举报
回复
快排,转堆排序,可以达到 nlogn

3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧