数据结构中排序算法的总结

来源:互联网 发布:nginx反向代理配置教程 编辑:程序博客网 时间:2024/05/01 04:45

★ 内部排序之插入排序      

1直接插入排序:一种最简单的排序方法,将一个记录插入到已排好序的有序表中得到一个新的有序表。

2折半插入排序:每次对有序表进行折半查找待插入记录的适当位置。

32-路插入排序:(2路优先插入到数组的前面和后面再插入到中间)新建一个和原来数组x类型一样的循环数组a,将x第一个元素值赋给a(0),指针firstfinal分别指向a中排好序的记录的第一个和最后一个记录。然后将x(1)x结尾的数组依次插入到a(0)前后的两个排好序的有序表中。(巧妙运用求余运算找出位置)

4、表插入排序:为了插入方便,设数组下标为0的为表头结点,并将头结点的关键字取表中最大关键字。先将静态链表中数组下标为1的点和头结点构成一个循环链表,然后依次把后面的结点依次按照关键字非递减有序插入到循环链表中。

该表不能进行随机查找,为了能实现有序表的折半查找,需要对记录进行重新排列。顺序扫描有序链表把链表中第i个节点移动到数组第i分量处。

5希尔排序:先将整个待排序记录按一定增量序列分割成若干个子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序。应使增量序列没有除一之外的公因子,且最后一个增量值必须为1

 

★内部排序之交换类排序

1冒泡排序: 反复扫描待排序序列,扫描过程中顺次比较相邻的两个元素,若逆序则交换,第一次扫描就会把最大或者最小的数据在末尾,第二趟只扫描前n-1个元素,然后得到次元素放在倒数第二个位置。

2快速排序任意选一个记录做枢轴,通过一趟排序将待排记录分割成独立的两部分,其中一部分的关键字均比另一部分记录的关键字小,则可分别对这两部分继续进行排序,以达到整个序列有序。

 

★内部排序之选择排序 

1简单选择排序:令i=1:n-1,进行n-1趟选择操作,每趟都是通过n-i次关键字间的比较,从n-i+1个记录中选择出关键字最小的记录,并和第i(0<i<=n)个记录交换之。

2树形选择排序:一种按照锦标赛的思想进行选择排序的方法, 首先对n个记录的关键字进行两两比较,然后在其中个较小者之间进行两两比较,如此重复,直到选出最小关键字的记录为止。

3堆排序Heap Sort):n个元素的序列满足i=1,....,)。将此序列看为一个完全二叉树,根据堆的定义则堆顶元素必为序列中n各元素的最小或最大值。在输出堆顶元素后,使剩下的n-1个元素的序列重新建成一个堆(把最后一个元素代了输出的堆顶元素,然后从上之下开始调整),得到n个元素中的次小值,如此反复,便可得到一个有序序列,这个过程称之为堆排序。


★内部排序之归并排序 (Merging sort)将两个或两个以上的有序表组合成一个新的有序表。

★内部排序之基数排序(Radix Sorting): 借助多关键字排序的思想对但逻辑关键字进行排序的方法。如整理扑克牌。

 

 

排序算法

最差时间复杂度

平均时间复杂度

最好时间复杂度

空间复杂度

冒泡排序

O(n^2)

O(n^2)

O(n)

1

插入排序

O(n^2)

O(n^2)

O(n)

1

归并排序

O(nlogn)

O(nlogn)

O(nlogn)

O(n)

桶排序

O(n)

O(n)

O(n)

O(k)

基数排序

O(dn)d为单逻辑关键码的个数

O(dn)

O(dn)

O(n)

二叉树排序

O(nlogn)

O(nlogn)

O(nlogn)

O(n)

不稳定的排序算法

选择排序

O(n^2)

O(n^2)

 

1

希尔排序


O(n^1.3)

 

1

堆排序

O(nlogn)

O(nlogn)

O(nlogn)

1

快速排序

O(n^2)

O(nlogn)

 O(nlogn)

O(nlogn)


0 0
原创粉丝点击