3,882
社区成员
发帖
与我相关
我的任务
分享各种排序算法动画演示http://www.webhek.com/misc/comparison-sort/ <1000个元素,冒泡排序 <100000个元素,qsort函数 <10000000个元素,放数据库中,建索引,(B+树排序) ≥10000000个元素,没用到过。
排序 算法上讲,一般是这么做的 小用 插入 。小或者基本有序 大用 快排 。快排到数据比较少的时候,换用 插入排序。 外部用 归并 ,涉及到外存 快排平均 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);//额外传递深度和最大深度两个参数 }
稳定性吧
[quote=引用 楼主 izsky 的回复:] 无法确定合并排序对错
快排,转堆排序,可以达到 nlogn
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);//额外传递深度和最大深度两个参数
}无法确定合并排序对错