排序算法(七)---- 非比较排序 一.计数排序顾名思义,通过记录原序列中的每个数据出现的次数,然后将其保存在辅助空间的对应位置(位置=当前数据-最小数据),通过分析辅助空间和原序列,可以将原序列变成有序序列算法如下:void CountSort(int arr[],int size){ int i=0; int max=arr[0]; int min=arr[0];
排序算法(六)---- 归并排序 对于归并排序,与快速排序一样,巧妙的应用了分治算法的核心思想,它将整个序列分成若干组子序列,对这些子序列进行排序后,在一步一步进行合并有序子序列,从而使得整个序列达到有序。但针对于归并排序,有着两种不同的排序方式,一是通过整个序列进行着手,将这个序列进行一步一步的划分,自顶向下进行处理,主要步骤包括序列划分,子序列排序,以及合并,而这一方法可以通过递归来实现;与之相对的就是另外一种方式,自底向
排序算法(五)---- 快速排序 对于快速排序,与冒泡排序一样属于交换排序,但是快速排序是在冒泡排序的基础之上的优化,由于冒泡排序需要进行多次的交换,从而导致冒泡排序的效率相对较低,而快速排序应用了分治这一算法思想,通过设定基准值,用序列中的数据与这一基准值进行比较,从而达到将所有大于基准值的数据放到基准值一边,所有小于基准值的数据放到基准值另一边这一目的。从而将原序列以基准值为界,分成大于基准值与小于基准值这两部分,然后对于这分割后的两部分,分别进行之前的操作
排序算法(四)---- 堆排序 利用最小堆/最大堆的性质,将数组中所有元素之间的关系构建成最大堆/最小堆,通过将堆顶元素(即arr[0])与末尾元素进行交换,此时尾部序列即为有序(最大堆为升序,最小堆为降序),然后对前面的元素(排除已进行过排序的末尾元素)重新构建最大堆/最小堆,因为堆顶元素与末尾元素进行了交换,很有可能造成最大堆/最小堆的性质遭到破坏,而由于只有堆顶元素发生了变化,所以这里可以采用从堆顶向下调整的方法,重新构建
排序算法(三)---- 选择排序 基本思想:在序列中找到最大(或最小)的值,将它放到序列区间的起始位置,随即缩小序列区间,进行重复操作,直到序列区间中没有数据注意选择排序与冒泡排序的区别:冒泡排序是交换两个相邻顺序与所求顺序相反的元素,从而将当前序列中的最大(最小)元素放到合适位置;而选择排序则是记录下当前序列中的最大(最小)元素,将其与合适位置的元素进行一次交换,使得最大(最小)元素放在合适位置选择排序的时间复杂度为O(
排序算法(二)---- 希尔排序 希尔排序又叫缩小增量排序,在直接插入排序的基础上,给定了一个增量gap,作为对给定序列的区间划分依据,如上gap=3,将原序列分为{5,4,1},{2,7,3},{9,6,8}三组数据,而对它们分别进行直接插入排序,在对每组完成直接插入排序之后,随即对增量进行缩小,直到gap=1时,此时在完成对应的直接插入排序之后,整个序列随即有序希尔排序的时间复杂度大致为O(N^1.25)~O(1.6N^1
排序算法(一)---- 直接插入排序 基本思想:取序列中的第i个元素,(在取到第i个元素之前,第i个元素前面的序列已经经过排序,成为有序序列,第i个元素及其之后的序列即为无序序列),将第i个元素与之前的有序序列中的元素依次进行比较,并将其插入到合适的位置,由此对原序列中的每一个元素进行上述操作,即可得到有序序列因为在获取待插入元素的时候要对数组进行一次遍历,而每遍历到一个元素又要将其与之前的有序序列中的元素进行比较,又要进行一次遍
终端,作业控制,守护进程 进程组:每个进程有唯一一个进程组ID(PGID),而每一个进程组都有一个组长进程(即进程组ID对应的进程),而组长进程可以创建一个进程组,对于一个进程组而言,只要这个进程组中有一个进程存在,那这个进程组就存在,与组长进程是否存在并没有关系作业:Shell分前后台控制的不是进程,而是进程组/作业,一个前台作业可以由多个进程组成,而一个后台作业同样也是如此,但对于Shell来说,只能同时运行一个前
一个特殊的信号---- SIGCHILD 这里重点提一下SIGCHLD信号(17号信号),对于父进程而言,一般要对它的子进程进行等待,以防止子进程变为僵尸进程,而导致内存泄漏问题,但是对于父进程的等待方式存在两种:阻塞式等待和非阻塞式等待,可以通过wait和waitpid这两个系统调用来实现,对于父进程而言,阻塞式等待让父进程停下自己手头上的事情,专心的等待子进程退出,这严重影响了父进程的工作;而对于非阻塞式等待,父进程每隔一段时间都要轮
浅谈Linux下信号 一.前台进程与后台进程前台进程在shell下运行时(如:./a.out),shell无法运行其他的进程;后台进程在shell下运行时(如:./a.out &),shell可以运行其他进程Ctrl+C,Ctrl+Z等组合键仅可以对前台进程起作用,对于后台进程无效(本质上组合键控制进程均会被解释成信号)ps aux | grep -ER './test'这条命令可以用来查看当前运行的进程(
进程间通信(四)---- 共享内存 共享内存机制是IPC机制中最快的通信方式,允许不同的进程访问同一块物理内存,通过这块内存进行进程间通信,进程的地址空间中有一部分称为共享区,而共享内存机制则是利用了这一部分的虚拟地址,通过使用共享区的虚拟地址,通过页表,MMU进行映射到某一物理内存上,而这块物理内存也通过同样的方法,被另一个进程所看到,这样就能进行进程间通信由于共享内存机制可以直接通过正常的访问物理内存的方式(地址空间上的虚拟
进程间通信(三)---- 信号量 信号量的本质是一种数据操作锁,本身不具有数据交换的功能,而是通过控制其他的共享资源(如共享内存)来实现进程间通信,其本身只是一种外部资源的标识,负责保证进程间通信的同步与互斥机制生命周期不随进程,随内核(与消息队列类似),也存在两个命令ipcs -s(查看系统中的信号量);ipcrm -s semid(释放指定信号量)所谓同步与互斥机制,互斥表示对于某一公共资源(也叫临界资源),在
进程间通信(二)----消息队列 首先,什么是消息队列?消息队列是System V下的IPC通信机制,消息队列提供了一种从一个进程向另一个进程发送一个具有类型的数据块的方法,我们可以通过消息队列避免管道的同步和阻塞问题,但是同管道一样,消息队列也存在长度的限制,每个数据块的大小具有限制,同时每个消息队列的长度也存在限制对于IPC的通信机制(包括消息队列,共享内存,信号量),内核都为其维护了一个IPC对象数据结构struct i
最长回文字符串问题 回文字符串是笔试中常考的题,下面给出回文字符串的一个经典题型:求出一个字符串当中的最长回文字符串长度1.最基本的解法对于这个问题,我们考虑到回文字符串的性质,即回文字符串正读,反读相同,左右对称,这样一来,最基本的方法就是得到所求字符串的所有子串,并判断它们是否是左右对称,方法如下:bool isAym(char *cbegin, char *cend){
进程间通信(一)-----管道 进程间通信的本质:让不同的进程看到一份公共的资源(由于进程之间相互独立,有各自不同的地址空间,所以对于一个进程中的数据,在其他进程中是看不到的,虽然这在一定程度上保证了进程间的独立性,但若两个进程之间想要进行通信,则必须借助内核,在内核中开辟一块缓冲区,两个进程均能看到这块缓冲区,让一个进程将数据从进程的地址空间拷到内核缓冲区中,再由另外一个进程从内核缓冲区中读数据,放到自己的地址空间当中)下
TCP/IP协议下三层协议(二)----传输层协议 1.UDP用户数据报协议首先,说明UDP的几个主要特点:①UDP是无连接的;②UDP尽最大努力交付,但不保证数据可靠性;③UDP是面向报文的;④UDP没有拥塞控制(网络出现拥塞状况并不会导致源主机的发送速率降低);⑤UDP支持一对一,一对多,多对一与多对多的交互通信;⑥首部开销小;UDP的数据段格式很简单,它的报头是定长(因此UDP协议报头信息中无需加入
TCP/IP下三层协议----网络接口层与网络层 一.网络接口层(链路层):①以太网帧格式:其中目的地址和源地址均是网卡地址(MAC地址),对于每个设备都是唯一的,ifconfig ---->HWaddr即是我们的MAC地址;而对于类型字段,可以有三种值:0800---IP,0806----ARP,8035----RARP;而对于帧末尾则是我们的CRC校验码以太网帧的数据长度最小为46字节,最大为1500字节,也就是封装上
网络基础总结 TCP/IP协议是一组协议,这些协议组成TCP/IP协议簇,TCP/IP协议自上到下,分四层:应用层,传输层,网络层,网络接口层(链路层)后三层由操作系统内核完成,用于处理通信细节;对于应用层则是由用户进程完成,处理应用进程细节对于不同的协议层,对数据包有不同的称谓:传输层----段,网络层----数据报,网络接口层(链路层)----帧对于OSI协议七层模型,从上到下分别为
路由算法与收敛路由原理 当两台主机在不同的局域网内,它们之间要进行通信,必然要经过路由器,而当一个数据包达到路由器时,路由器会获取这个数据包的目的IP地址,而通过查看路由器的路由表,路由器会判断将这个数据包送往何处首先对于路由表,当中的每一行表示一个路由条目,我们的路由表是由若干个路由条目组成,每个路由条目当中包含了目的网络地址Destination,下一跳地址Gateway,子网掩码Genmask,Flags(Fl
NAT技术与代理服务器 一.NAT技术NAT技术也叫网络地址转换技术,是一种私有地址转换成合法IP地址的技术,要了解他之前,首先得了解什么是私有地址,什么是合法IP地址,其次为什么要引入这样的技术。①私有地址和合法IP地址如果组建一个局域网,其中的IP地址仅用于局域网内部通信,而不能直接连到Internet外网上的话,那么这些IP地址就是局域网的私有IP地址,理论上所有IP地址均可作为私有IP地址,但是RFC