排序:算法
就是使一串数据,按照其中的某个或某些关键字大小,递增或递减的排序操做。数组
稳定性指的是:当有相同元素时,排序完成后能够保证其相对位置不变,则就是稳定,若是不能保证其相对位置不变,那就不是稳定的。ide
一、插入排序优化
直接插入排序:在一个有序的序列中插入数据,使其序列仍然有序。spa
时间复杂度为O(N^2),最好状况为O(N)。指针
空间复杂度为O(1)排序
是一种稳定的排序算法。递归
希尔排序:先选定一个整数gap,把待排序的数据分为若干组,并对每一组进行排序。也就是直接插入排序的优化,根据gap大小,先进行了一次预排序,再将gap依次改变直到为1,其排序就是直接插入排序了。gap必定为:gap=gap/n+1;加1是为了gap必定会等于1.内存
当gap>1时,都是预排序,当gap=1时,就为直接插入排序。it
时间复杂度为O(N^1.3)
是不稳定的排序。
二、选择排序
思想:每次在待排序数据中选出最小或最大的数据,存放在序列的起始位置。
直接选择排序:效率很是低,
时间复杂度为O(N^2);
空间复杂度为O(1);
排序算法不是稳定的。
堆排序:是利用建堆来排序的。
若是须要降序,则建小堆,若是升序,则建大堆。
时间复杂度为O(N*logN)
空间复杂度为O(1);
是不稳定的排序算法。
三、交换排序
冒泡排序:就是将数据一一比较,每次比较完成都会产生一个数,在其本身位置上,须要比较n-1次。
时间复杂度为O(N^2)。
空间复杂度为O(1)。
时稳定的排序算法。
快速排序
时间复杂度为O(N*logN)
空间复杂度为O(logN)
不稳定的排序算法。
hoare法(左右指针法)
就是将begin和end依次移动,若是升序,则begin这段找大与key,end找小于key的,找到就互换,知道begin==end。
最右边作key,左边先走,左边作key,右边先走。由于这样作,必定能够肯定最后停的位置会和key交换。
挖坑法:
就是找左/右一端为key,使其为一个空位,在其右/左找个数插入其坑位,这样被插入数据的位置就变为坑位,再在左/右找个数插入,知道begin==end。
先后指针法
定义2个变量prev和cur,cur=begin,prev=begin-1;cur找小,遇到小,则prev前进一个,再互换cur和prev的值。遇到大,则cur前进,prev不变。
快排什么状况下最慢: 数据有序的时候。能够利用三数取中法来解决这个问题。
将快排的递归转化为非递归。利用栈就能够,将待排数据的下标放到栈里面。利用栈实现递归的过程
由于递归有时候会形成栈溢出。因此须要非递归。
四、归并排序
思想:就是将2个有序的序列,归并为一个有序的序列。
时间复杂度为O(NlogN)
空间复杂度为O(N)
稳定的排序算法
五、计数排序(非比较排序)
思想:一、统计每一个元素出现的次数。再按照次数将每一个元素返回回去。
按照最大值与最小值之间的差值,来定义统计次数数组的大小range.
时间复杂度为O(MAX(range,N))
空间复杂度为O(range)
是个稳定的排序算法。
补充知识点:
假设有一个10个G的大文件,须要将此排序。
能够将这个10G大文件切成10个1G的小文件,放到内存里面对这10个进行排序(建议使用快排),而后将这10个排好序的文件进行归并,获得一个10G有序的大文件。
主要须要注意:归并排序,计数排序,今天刚刚学的。