各种排序算法的比较次数
2015-08-08 21:16
267 查看
借助比较的排序每次比较贡献O(1)的复杂度
插入排序
最少n-1 最多n(n-1)/2
冒泡排序
最少n-1 最多n(n-1)/2
选择排序
n(n-1)/2
快速排序
int partition(int *arr , int low , int high)
{
int pivo = arr[low];
while(low < high)
{
while(low < high && arr[high] >= pivo)
--high;
arr[low] = arr[high];
while(low < high && arr[low] <= pivo)
++low;
arr[high] = arr[low];
}
arr[low] = pivo;
return low;
}
// 快速排序 递归
void qsort(int *arr , int low , int high)
{
if(low < high)
{
int pivo = partition(arr , low , high);
qsort(arr , low , pivo-1);
qsort(arr , pivo+1 , high);
}
}
分析:在递归部分由于递归深度可为logn -- n,故递归部分的比较次数为logn -- n,partition部分的比较次数与数据分布有关,大约为n次,还需进一步分析。。。
总共比较次数nlogn -- n^2
希尔排序
??
归并排序
在每一次二路归并的过程中,对于N个元素:当一个数组的最小元素比另一数组的最大元素还大时;若两个数组元素交替增长,比较次数最多,为2N-1
再加上递归深度logN,故比较次数为 NlogN -- (2N-1)logN
堆排序
??
插入排序
最少n-1 最多n(n-1)/2
冒泡排序
最少n-1 最多n(n-1)/2
选择排序
n(n-1)/2
快速排序
int partition(int *arr , int low , int high)
{
int pivo = arr[low];
while(low < high)
{
while(low < high && arr[high] >= pivo)
--high;
arr[low] = arr[high];
while(low < high && arr[low] <= pivo)
++low;
arr[high] = arr[low];
}
arr[low] = pivo;
return low;
}
// 快速排序 递归
void qsort(int *arr , int low , int high)
{
if(low < high)
{
int pivo = partition(arr , low , high);
qsort(arr , low , pivo-1);
qsort(arr , pivo+1 , high);
}
}
分析:在递归部分由于递归深度可为logn -- n,故递归部分的比较次数为logn -- n,partition部分的比较次数与数据分布有关,大约为n次,还需进一步分析。。。
总共比较次数nlogn -- n^2
希尔排序
??
归并排序
在每一次二路归并的过程中,对于N个元素:当一个数组的最小元素比另一数组的最大元素还大时;若两个数组元素交替增长,比较次数最多,为2N-1
再加上递归深度logN,故比较次数为 NlogN -- (2N-1)logN
堆排序
??
相关文章推荐
- hdu1285 确定比赛名次 (拓扑排序)
- 系统拆分原则
- JavaScript学习笔记——BOM_window对象
- 01 开篇
- [BZOJ3224]Tyvj 1728 普通平衡树
- linux apt-get 之LAMP架设
- FragmentTabHost+viewPager实现底部导航栏
- Sum Root to Leaf Numbers
- 两种比较“强壮”的单例代码。
- [M]带属性块参照的转换
- 博客园文章编辑器【客户端应用程序】V2.0.0发布,命名为51cnblogs
- 扫描线 - UVALive - 6864 Strange Antennas
- Linux中命令行和图形界面之间切换
- [转]数据中心网络虚拟化 隧道技术
- 【数论+dp】codeforces559C Gerald and Giant Chess
- 兼容的可视区高度和宽度
- iOS 调试用Log()与随机颜色设置
- 为什么和其他语言相比C语言是快速的语言
- Wayland与Weston简介
- windows内存管理的几种方式的优缺点