排序算法 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选择归并排序作为泛型的排 ...
随机推荐
- ubuntu 常用命令
此处为使用ubuntu中常用的命令,不会全面深入讲解命令,仅供日常使用查看,以备遗忘. 不定时更新! 1.远程传输文件(小文件) scp [user@源文件地址:/目录/.../file] [目的地址 ...
- python数据结构与算法——图的基本实现及迭代器
本文参考自<复杂性思考>一书的第二章,并给出这一章节里我的习题解答. (这书不到120页纸,要卖50块!!,一开始以为很厚的样子,拿回来一看,尼玛.....代码很少,给点提示,然后让读者自 ...
- python数据结构与算法——归并排序
归并排序: 原理与C语言实现 参考:白话经典算法系列之五 归并排序的实现 1. 容易对有序数组A,B进行排序. 2. 为了使得A,B组内数据有序:可以将A,B组各自再分成二组. 3. 经过不断分组,当 ...
- 如何成为一名优秀的前端工程师 (share)
发现一篇不错的博文,和大家分享一下,为有志成为一名优秀前端工程师的童鞋们提供一个参考. :)~ 本文来源:http://www.biaodianfu.com/what-makes-a-good-fro ...
- JAVA 编码中文简述
中文编码问题虽然是个老问题,但对不熟悉的人来说还是不好处理的.不过Java中已经有了一套比较成熟的解决方案. 首先对中文编码格式予以简单介绍:中文编码有三套国标:GB2312,GBK,GB18030, ...
- map的应用
1.map最基本的构造函数: map<string , int >mapstring; map<int ,string >mapint; map&l ...
- Fragment +ViewPager
public class MainActivity extends FragmentActivity { private ViewPager vp; @Override protected vo ...
- 一些鲜为人知却非常实用的数据结构 - Haippy
原文:http://www.udpwork.com/item/9932.html 作为程序猿(媛),你必须熟知一些常见的数据结构,比如栈.队列.字符串.链表.二叉树.哈希,但是除了这些常见的数据结构以 ...
- nova-scheduler start flow
- tkprof
http://blog.csdn.net/pan_tian/article/details/7677338 需要调整的语句符合以下几点: (1).CPU占用过多 (2).Parse,Execute,F ...