c语言核心整理之深入数组,熟练常用的基于数组的排序和搜索算法

深入数组,熟练常用的基于数组的排序和搜索算法
(1)数组名的值是一个指针常量,也就是数组第一个元素的地址,它的类型取决于数组元素的类型,如果他们是int型,数组名的类型就是“指向int的常量指针”。
(2)指针与下标:下标绝不会比指针更有效率,但指针有时会更有效率。
eg:当在数组中一次一步(或某个固定数字)地移动时,与固定数字相乘的运算在编译时完成,所以在运行时所需的指令就少一些。在绝大数机器上,程序将会更小一些、更快一些。[指针比下标更有效率]
(3)2[array] ==== array[2]意义相同
(4)Tips:1)当你根据某个固定数目的增量在一个数组中移动时,使用指针变量将比使用下标产生效率更高的代码。当这个增量是1且机器具有地址自动增量模型时,这点表  现更为突出。
       2)声明为寄存器变量(register)的指针通常比位于静态内存和堆栈中的指针效率更高。
   3)如果你可以通过测试一些已经初始化并经过调整的内容来判断循环是否应该终止,此时不需要单独使用一个计数器。
   4)那些必须在运行时求值的表达式较之如&array[size]或array+size这样的常量表达式往往代价更高。
   5)只要有可能,函数的指针形参都应声明为const.
(5)数组中只有第一维的初始值个数可以省略,编译器可以进行推断。
(6)常见的数组排序算法
1)交换排序:空间复杂度:O(1)       时间复杂度:O(n^2)
2)冒泡排序:空间复杂度:O(1)       时间复杂度:O(n^2)
3)选择排序:空间复杂度:O(1)       时间复杂度:O(n^2)
4)插入排序:空间复杂度:O(1)     时间复杂度:O(n^1.5)/O(n^2)
5)希尔排序:空间复杂度:O(1)       时间复杂度:O(n^1.35)/O(n^1.5)
6)快速排序:空间复杂度:O(logn)   时间复杂度:O(n*logn)
7)堆排序:空间复杂度:O(1)           时间复杂度:O(n*logn)
8)归并排序:空间复杂度:O(n)        时间复杂度:O(n*logn)
9)基数排序
(7)常见的数组搜索算法
1)数组的顺序查找
依照数组中元素的顺序,依次进行比较,以查找出元素的位置。
条件:无序或有序队列
时间复杂度:O(n)
2)数组的折半查找(二分查找)
查找过程从数组的中间元素开始,如果中间元素正好是要查找的元素,搜索过程结束,若不是,则每次缩小搜索范围。折半查找极大地提高了查找性能,但是它是以排序数组为代价的。
条件:有序数组
时间复杂度:O(logn)
3)哈希表(散列表)
根据键值方式(key value)进行查找,通过散列函数,定位数据元素。
条件:先创建哈希表(散列表)

时间复杂度:几乎是O(1),取决于产生冲突的多少。


若文章中存在问题,欢迎大家指正。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值