排序算法 2 qsort 库函数,泛型函数
_____谈谈排序算法
交换排序——>冒泡排序-->快速排序
选择排序——>简单选择排序——>堆排序
插入排序——>直接插入排序——>希尔排序
_____排序算法对比
名称 |
稳定性 |
时间复杂度 |
空间复杂度 |
描述 |
数据对象为链表 |
||
平均 |
最坏 |
||||||
冒泡排序 |
Y |
O(n^2) |
O(1) |
无序区,有序区。 |
|
||
选择排序 |
|
O(n^2) |
O(1) |
有序区,无序区 |
稳定性Y,其它同数组 |
||
插入排序 |
Y |
O(n^2) |
O(1) |
有序区,无序区 |
同数组 |
||
堆排序 |
|
O(n log n) |
O(1) |
最大堆,有序区 |
|
||
归并排序 |
Y |
O(n log n) |
O(n)+O(log n) |
将数据分为两段,逐段排序 |
空间复杂度O(1) |
||
快速排序 |
|
O(n log n) |
O(n^2) |
O(log n)-O(n) |
选择基数,调整方位 |
|
|
希尔排序 |
|
O(n log n) |
O(n^2) |
O(1) |
每次循环按间隔进行插入排序 |
|
快速排序针对小数目数组列表的优化为最佳的排列方法。
-------库函数
在stdlib 中定义了qsort库函数
void qsort (void* base, size_t num, size_t size,
int (*compar)(const void*,const void*));
//这是一个泛型函数,适用于不同的类型。
int compareMyType (const void * a, const void * b)
{
if ( *(MyType*)a < *(MyType*)b ) return -;
if ( *(MyType*)a == *(MyType*)b ) return ;
if ( *(MyType*)a > *(MyType*)b ) return ;
}
//我写的
void quickSort(void* base,size_t size,size_t low,size_t high,int (*compar)(const void*,const void*))
{
int left = low;
int right = high;
int keyPos = low; //set the first element key
uchar keyBuffer[size];
if(low >= high)
return;
memcpy( keyBuffer, (uchar *)base + keyPos*size, size ); while(right>left )
{
while( right>left && compar( (uchar *)base + right*size,keyBuffer )>=)
{
right--;
}
memcpy( (uchar *)base + left*size, (uchar *)base + right*size, size ); //right considered to store key
while( right>left && compar(keyBuffer, (uchar *)base + left*size)>= )
{
left++;
}
memcpy( (uchar *)base + right*size, (uchar *)base + left*size, size ); //left considered to store key
}
memcpy((uchar *)base + left*size,keyBuffer,size);
if(left->)
quickSort(base,size,low,left-,compar);
quickSort(base,size,left+,high,compar);
} void qsort (void* base, size_t num, size_t size,
int (*compar)(const void*,const void*))
{
quickSort(base,size,,num-,compar);
}
排序算法 2 qsort 库函数,泛型函数的更多相关文章
- 具体解释Redis源代码中的部分高速排序算法(pqsort.c)
看标题.你可能会疑惑:咦?你这家伙.怎么不解说完整的快排,仅仅讲一部分快排---.- 哎,冤枉. "部分快排"是算法的名字.实际上本文相当具体呢.本文差点儿与普通快排无异.看懂了本 ...
- 学习Java 以及对几大基本排序算法(对算法笔记书的研究)的一些学习总结(Java对算法的实现持续更新中)
Java排序一,冒泡排序! 刚刚开始学习Java,但是比较有兴趣研究算法.最近看了一本算法笔记,刚开始只是打算随便看看,但是发现这本书非常不错,尤其是对排序算法,以及哈希函数的一些解释,让我非常的感兴 ...
- JavaScript 数据结构与算法之美 - 十大经典排序算法汇总(图文并茂)
1. 前言 算法为王. 想学好前端,先练好内功,内功不行,就算招式练的再花哨,终究成不了高手:只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 ...
- 排序算法----调用库函数qsort进行快速排序
功 能: 快速排序 头文件:stdlib.h 用 法: void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const ...
- C++ Primer : 第十章 : 泛型算法 之 只读、写和排序算法
大多数算法都定义在<algorithm>头文件里,而标准库还在头文件<numeric>里定义了一组数值泛型算法,比如accumulate. ● find算法,算法接受一对迭代 ...
- c/c++ 通用的(泛型)算法 之 只读算法,写算法,排序算法
通用的(泛型)算法 之 只读算法,写算法,排序算法 只读算法: 函数名 功能描述 accumulate 求容器里元素的和 equal 比较2个容器里的元素 写算法 函数名 功能描述 fill 用给定值 ...
- Python的函数式编程-传入函数、排序算法、函数作为返回值、匿名函数、偏函数、装饰器
函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计的基本单元. ...
- 排序方法之标准库中的快排 qsort ()函数
C标准库qsort()函数的用法(快排) 使用快速排序例程进行排序 头文件:stdlib.h 用 法: void qsort(void *base, int nelem, int width, i ...
- java泛型中使用的排序算法——归并排序及分析
一.引言 我们知道,java中泛型排序使用归并排序或TimSort.归并排序以O(NlogN)最坏时间运行,下面我们分析归并排序过程及分析证明时间复杂度:也会简述为什么java选择归并排序作为泛型的排 ...
随机推荐
- 引用计数gc机制使用不当导致内存泄漏
上一篇文章找同事review了一下,收到的反馈是铺垫太长了,我尽量直入正题,哈哈 最近dbd压测时发现内存泄漏,其实这个问题去年已经暴露了,参见这篇博客[压测周].当时排查不够仔细,在此检讨下.关于d ...
- 国内较快的maven镜像
原文网址:http://www.cnblogs.com/dingyingsi/p/3856456.html 国内连接maven官方的仓库更新依赖库,网速一般很慢,收集一些国内快速的maven仓库镜像以 ...
- for循环相关
循环语句是指令式编程的常见语句,Scala对其加以改进,成为适应函数式风格的利器. for循环中的变量,没有val或者var,是因为变量的类型,完全是集合中的元素的类型.作用域持续到括号结束. 在sc ...
- Java笔记6-数组
知识大纲一.数组的应用由于数组是用来存储数据的,所以,它的操作总是增.删除.改.查的操作.数组做为一种最基本的数据结构,它在查询上效率是最高的.但是在增加.删除的操作效率是最低的. 因为,数组的长度一 ...
- my Js
1. __doPostBack是.net自动生成的(当页面中有LinkButton.DropDownList(AutoPostBack)等时:Button和ImageButton不会生成它,也不会调用 ...
- asp.net httpmodule 访问页面控件 备忘
用到的时候发现还得找代码,存一个例子方便自己和他人修改: using System; using System.Data; using System.Configuration; using Syst ...
- Hadoop的I/O操作
HDFS的数据完整性 检验数据是否损坏最常见的措施是:在数据第一次引入系统时计算校验和并在数据通过一个不可靠通道进行传输时再次计算校验和,这样就能发现数据是否被损坏.HDFS会对写入的所有数据计算校验 ...
- Intellij IDEA连接Git@OSC
错误提示:fatal: remote origin already exists. 解决办法:$ git remote rm origin http://my.oschina.net/lujianin ...
- eclipse美化
// */ // ]]> eclipse美化 Table of Contents 1 中文字体 2 皮肤 3 emacs+ 1 中文字体 win7下打开eclipse3.7中文字体很小,简直 ...
- ROC曲线
1.混淆矩阵(confusion matrix) 针对预测值和真实值之间的关系,我们可以将样本分为四个部分,分别是: 真正例(True Positive,TP):预测值和真实值都为1 ...