_____谈谈排序算法

交换排序——>冒泡排序-->快速排序

选择排序——>简单选择排序——>堆排序

插入排序——>直接插入排序——>希尔排序

_____排序算法对比

名称

稳定性

时间复杂度

空间复杂度

描述

数据对象为链表

平均

最坏

冒泡排序

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 库函数,泛型函数的更多相关文章

  1. 具体解释Redis源代码中的部分高速排序算法(pqsort.c)

    看标题.你可能会疑惑:咦?你这家伙.怎么不解说完整的快排,仅仅讲一部分快排---.- 哎,冤枉. "部分快排"是算法的名字.实际上本文相当具体呢.本文差点儿与普通快排无异.看懂了本 ...

  2. 学习Java 以及对几大基本排序算法(对算法笔记书的研究)的一些学习总结(Java对算法的实现持续更新中)

    Java排序一,冒泡排序! 刚刚开始学习Java,但是比较有兴趣研究算法.最近看了一本算法笔记,刚开始只是打算随便看看,但是发现这本书非常不错,尤其是对排序算法,以及哈希函数的一些解释,让我非常的感兴 ...

  3. JavaScript 数据结构与算法之美 - 十大经典排序算法汇总(图文并茂)

    1. 前言 算法为王. 想学好前端,先练好内功,内功不行,就算招式练的再花哨,终究成不了高手:只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 ...

  4. 排序算法----调用库函数qsort进行快速排序

    功 能: 快速排序 头文件:stdlib.h 用 法: void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const ...

  5. C++ Primer : 第十章 : 泛型算法 之 只读、写和排序算法

    大多数算法都定义在<algorithm>头文件里,而标准库还在头文件<numeric>里定义了一组数值泛型算法,比如accumulate. ●  find算法,算法接受一对迭代 ...

  6. c/c++ 通用的(泛型)算法 之 只读算法,写算法,排序算法

    通用的(泛型)算法 之 只读算法,写算法,排序算法 只读算法: 函数名 功能描述 accumulate 求容器里元素的和 equal 比较2个容器里的元素 写算法 函数名 功能描述 fill 用给定值 ...

  7. Python的函数式编程-传入函数、排序算法、函数作为返回值、匿名函数、偏函数、装饰器

    函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计的基本单元. ...

  8. 排序方法之标准库中的快排 qsort ()函数

    C标准库qsort()函数的用法(快排) 使用快速排序例程进行排序 头文件:stdlib.h 用 法: void qsort(void *base, int  nelem, int  width, i ...

  9. java泛型中使用的排序算法——归并排序及分析

    一.引言 我们知道,java中泛型排序使用归并排序或TimSort.归并排序以O(NlogN)最坏时间运行,下面我们分析归并排序过程及分析证明时间复杂度:也会简述为什么java选择归并排序作为泛型的排 ...

随机推荐

  1. 如何修改Eclipse在Debug时背景色

    比较喜欢暗色的Eclipse主题,安装了Eclipse color theme,使用了Oblivion这个黑色背景的主题. 更换了暗色的Eclipse主题后,Debug时看不清文字: 需要更背景颜色, ...

  2. Java初学者入门应该掌握的30个概念

    1.OOP中唯一关系的是对象的接口是什么,就像计算机的销售商她不管电源内部结构 是怎样的,他只关系能否给你提供电就行了,也就是只要知道can or not而不是how and why.所有的程序是由一 ...

  3. php Session存储到Redis的方法

    当然要写先安装php的扩展,可参考这篇文章:Redis及PHP扩展安装 修改php.ini的设置 复制代码 代码如下: session.save_handler = redis session.sav ...

  4. addresslist

    #include<iostream> #include<cstring> #include<cstdio> #include<cctype> #incl ...

  5. 解决android 启动白屏问题

    Android 启动APP时黑屏白屏的三个解决方案 http://www.cnblogs.com/liqw/p/4263418.html android:windowSoftInputMode属性使用 ...

  6. JS特殊函数(Function()构造函数、函数直接量)区别介绍

    函数定义 函数是由这样的方式进行声明的:关键字 function.函数名.一组参数,以及置于括号中的待执行代码. 函数的构造语法有这三种: 1.function functionName(arg0, ...

  7. Spring加载resource时classpath*:与classpath:的区别

    http://blog.csdn.net/kkdelta/article/details/5507799   classpath: 第一个匹配的 classpath*:多个组件中的可匹配的

  8. 【python】传入函数

    def add(x, y, f): return f(x) + f(y) 当我们调用add(-5, 6, abs)时,参数x,y和f分别接收-5,6和abs,根据函数定义,我们可以推导计算过程为: x ...

  9. [工具开发] 一信通 Web 短信发送客户端

    一.简介 为了协助公司运营部对几家短信平台进行测试,我根据各自的接口文档编写了几个简单的短信发送客户端: 下面是一信通 Web 短信发送客户端,使用 HTTP GET 方法. 二.效果图 1. 首页 ...

  10. nginx,php相关

    nginx安装 http://www.nginx.cn/install php安装 https://segmentfault.com/a/1190000004123048#articleHeader5 ...