经典排序算法

来源:互联网 发布:编写windows应用程序 编辑:程序博客网 时间:2024/05/21 06:48

数值算法:解方程、微积分、数值分析   多用在工程设计

非数值算法:搜索、排序、拆分、合并   多用在系统

 

一、线性搜索

1.算法

1.1从头开始,依次将每一个元素与查找目标进行比较

1.2或者找到目标,或者找不到目标

2.评估

2.1平均时间复杂度:O(N),线性时间

2.2对数据没有任何规律性要求   穷举法

 

二、二分搜索(折半搜索)

1.算法

1.1假设表中的元素按升序排列

1.2若中间元素与查找目标相等,则查找成功,否则利用中间元素将表划分为前后两个子表

1.3若查找目标小于中间元素,则在前子表中继续查找,否则在后子表中继续查找

1.4重复以上过程,直到查找成功,或者因子表不存在,而宣告失败

2.评估

2.1平均时间复杂度:O(logN)

2.2限制:对数据有有序性要求

 

三、冒泡排序

两两比较,大的靠后排(向上冒泡),每趟冒一个

对N个元素,需要扫描N-1趟,第i趟做N-1-i次比较

1.算法

1.1对相邻元素做两两比较,前者大于后者,彼此交换;

1.2从第一对到最后一对,最大的元素沉降到最后;

1.3针对未排序部分,重复以上步骤,沉降次大元素;

1.4每次扫描越来越少的元素,直至不在发生交换

2.评估

2.1平均时间复杂度:O(N^2)

2.2是稳定排序(排序前后等值元素的数序不变)

2.3对数据的有序性敏感  如果排序接近有序,则排序非常快,且代码复杂度低

 

四 插入排序

1.算法

1.1首元素自然有序;

1.2取出下一个元素,对已排序序列,从后向前扫描;

1.3大于被取出元素者后移;

1.4小于被取出元素者,将被取出元素插入其后;

1.5重复2,直到2处理完所有元素

2.评估

2.平均时间复杂度:O(N^2)

2.2稳定排序、

2.3对数据的有序性非常敏感、

2.4不交换,只是移动,优于冒泡

 

五 选择排序

1.算法

1.1在整个序列中寻找最小元素,与首元素交换、

1.2在剩余序列中寻找最小元素,与剩余序列的首元素交换

1.3直到剩余序列中仅盛一个元素为止

2.评估

2.1不稳定排序 值相同的元素,前后顺序会发生变化

2.2平均时间复杂度  O(N^2)

2.3对数据的有序性不敏感

2.4交换次数少,优于冒泡排序

 

六 快速排序

1.算法

1.1从待排序序列中任意挑选一个元素,作为基准;

1.2将所有小于基准的元素放在基准之前,大于基准的元素放在基准之后,等于基准的元素放在基准之前或之后,这个过程称为分组;

1.3以递归的方式,分别对基准之前和基准之后的分组继续进行分组,知道每个分组内的元素个数不多于1个

2.评估

2.1平均时间复杂度:O(NlogN)线性增长

2.1非稳定排序

2.3如果每次都能均匀分组,速度达到极值

     通常选择中间位置作为基准,产生均匀分组的几率最高

 


 

q_sort原型

void qsort(void* base,            //数组首地址

              size_t nmemb,       //数组元素个数

              size_t size,            //数组元素字节数

              int (*compar)(const void*,const void*)   //比较函数

);

七、归并排序

平均时间复杂度:O(2NlogN)

稳定排序。

对数据的有序性不敏感。

非就地排序。需要额外的内存空间。

0 0
原创粉丝点击