详细内容

1.排序算法对比

2.快速排序?

  • 原理: 。在待排序的n个记录中任取一个记录(通常取第一个记录),把该记录放入适当位置后,数据序列被此记录划分成两部分。所有关键字比该记录关键字小的记录放置在前一部分,所有比它大的记录放置在后一部分,并把该记录排在这两部分的中间(称为该记录归位),这个过程称作一趟快速排序
  • (它是由冒泡排序改进而来的)
  • 稳定性:不稳定,每次都需要和中间元素交换,原来的顺序会被打乱
  • 算法复杂度:最好的情况下:因为每次都将序列分为两个部分(一般二分都复杂度都和logN相关),故为 O(NlogN) ;最坏的情况下:基本有序时,退化为冒泡排序,几乎要比较N**N次,故为O(NN)

    3.堆排序

    以堆数据结构,堆分为大顶堆和小顶堆,是完全二叉树,大顶堆素有父节点都比子节点大,小顶堆所有父节点都比子节点小,构建初始堆之后就能进行排序了
  • 构建过程:按序建立初始完全二叉树,然后调整节点(父节点与左右孩子三者比较,最大的作为父节点),构建初始堆,然后进行排序;比如大顶堆,根为最大值,然后继续调整其他节点找出第二大的

    9.归并排序

  • 概念:多次将两个或两个以上的有序表合并成一个新的有序表

2、算法时间复杂度 最好的情况下:一趟归并需要n次,总共需要logN次,因此为O(NlogN) 最坏的情况下,接近于平均情况下,为O(NlogN) 说明:对长度为n的文件,需进行logN 趟二路归并,每趟归并的时间为O(n),故其时间复杂度无论是在最好情况下还是在最坏情况下均是O(nlgn)。

3、稳定性 归并排序最大的特色就是它是一种稳定的排序算法。归并过程中是不会改变元素的相对位置的。

4、缺点是,它需要O(n)的额外空间。但是很适合于多链表排序。

4.冒泡排序

  • 概念:*通过无序区中相邻记录关键字间的比较和位置的交换,使关键字最小的记录像气泡一样向上冒。

    5.希尔排序

  • 概念:希尔排序也是一种插入排序方法,实际上是一种分组插入方法。先取定一个小于n的整数d1作为第一个增量,把表的全部记录分成d1个组,所有距离为d1的倍数的记录放在同一个组中,在各组内进行直接插入排序;然后,取第二个增量d2(<d1),重复上述的分组和排序,直至所取的增量dt=1(dt<dt-1<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止

    6.基数排序

  • 概念:它是一种非比较排序。它是根据位的高低进行排序的,也就是先按个位排序,然后依据十位排序……以此类推
     2、算法的时间复杂度 
     分配需要O(n),收集为O(r),其中r为分配后链表的个数,以r=10为例,则有0~9这样10个链表来将原来的序列分类。而d,也就是位数(如最大的数是1234,位数是4,则d=4),即"分配-收集"的趟数。因此时间复杂度为O(d*(n+r))。
     3、稳定性 
        基数排序过程中不改变元素的相对位因此是稳定的!
     4、适用情况:如果有一个序列,知道数的范围(比如1~1000),用快速排序或者堆排序,需要O(N*logN),但是如果采用基数排序,则可以达到O(4*(n+10))=O(n)的时间复杂度。算是这种情况下排序最快的!!
    

    7.直接选择排序

  • 概念:首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾。以此类推,直到所有元素均排序完毕。具体做法是:选择最小的元素与未排序部分的首部交换,使得序列的前面为有序。

    2、时间复杂度。 
    最好情况下:交换0次,但是每次都要找到最小的元素,因此大约必须遍历N*N次,因此为O(N*N)。减少了交换次数! 
    最坏情况下,平均情况下:O(N*N)
    3、稳定性 
    由于每次都是选取未排序序列A中的最小元素x与A中的第一个元素交换,因此跨距离了,很可能破坏了元素间的相对位置,因此选择排序是不稳定的!
    

    8.直接插入排序

  • 概念:每次选择一个元素K插入到之前已排好序的部分A[1…i]中,插入过程中K依次由后向前与A[1…i]中的元素进行比较。若发现发现A[x]>=K,则将K插入到A[x]的后面,插入前需要移动元素

3、算法时间复杂度。
最好的情况下:正序有序(从小到大),这样只需要比较n次,不需要移动。因此时间复杂度为O(n)
最坏的情况下:逆序有序,这样每一个元素就需要比较n次,共有n个元素,因此实际复杂度为O(n­2)
平均情况下:O(n­2)

4、稳定性。
理解性记忆比死记硬背要好。因此,我们来分析下。稳定性,就是有两个相同的元素,排序先后的相对位置是否变化,主要用在排序时有多个排序规则的情况下。在插入排序中,K1是已排序部分中的元素,当K2和K1比较时,直接插到K1的后面(没有必要插到K1的前面,这样做还需要移动!!),因此,插入排序是稳定的。

10.最快的排序桶排序

假设有一组长度为N的待排关键字序列K[1....n]。首先将这个序列划分成M个的子区间(桶) 。然后基于某种映射函数 ,将待排序列的关键字k映射到第i个桶中(即桶数组B的下标 i) ,那么该关键字k就作为B[i]中的元素(每个桶B[i]都是一组大小为N/M的序列)。接着对每个桶B[i]中的所有元素进行比较排序(可以使用快排)。然后依次枚举输出B[0]....B[M]中的全部内容即是一个有序序列。

时间复杂度O(n)

results matching ""

    No results matching ""