算法基础

一:插入排序

插入排序:对于少量的元素排序,它是个有效的算法。时间复杂度:N^2

插入排序好比一手扑克牌。每次从桌上拿走一张牌将它按顺序插入正确的位置。为了找到这张牌的正确位置,我们需要从右到左依次比较(靠左最小)。

伪代码如下:

二:归并排序

分治法:分解、解决、合并

1:分解元问题为若干子问题,这些子问题是元问题的规模较小的实列。

2:解决这些子问题,递归地求解各子问题。

3:合并这些子问题的解就成元问题的解。

归并排序完全遵循分治模式。关键是合并。

假设(A,p,q,r) 其中A是一个数组,p、q和r是数组下标,满足p<=q<r。

假设子数组A[p······q]和 A[q+1,·····r]都已经排好序

只要合并两个子数组就可以替代A[p····r]。

 伪代码如下:

时间复杂度:nlgn

三:堆排序

时间复杂度: nlgn

最大堆:A[parent(i)]>=a[i]  结点的值至多与父结点一样大,堆中最大的元素为根结点。

A.length 为给出数组的元素个数

A.heap-size:有多少个堆元素存储在该数组中

 

1.堆维护性质(Max-Heapify(A,i))

用于维护最大堆性质。

Max-Heapify(A,i)

伪代码:

 2.建堆(Build-Max-Heap(A))

利用Max-Heapify 把咦个大小为n=A.length的数组A[1``n]转化为最大堆。

伪代码:

3.堆排序算法

 堆排序利用Build-Max-Heap将输入数组A[1···n]建成最大堆,其中n=A.length,此时数组中最大元素总在根结点A[1]中

这时候我们从堆中去掉结点n,调用Max-Heapify(A,1),从而在A[1,···n-1]构造一个新的最大堆。重复此过程,直到堆的大小从n-1降到2

伪代码如下:

原文地址:https://www.cnblogs.com/lulup/p/4141185.html