1.插入类排序:是在一个已排好序的记录子集的基础上,每一步将下一个待排序的记录有序插入已排好序的记录子集,直到将所有待排记录全部插入为止
a.直接插入排序(稳定)
b.折半插入排序(稳定)
c.希尔排序(不稳定)
2.交换类排序:通过一系列交换逆序元素进行排序
a.冒泡排序:通过对相邻的数据元素进行交换,一次交换只能消除一个逆序(稳定)
b.快速排序:一次交换可能消除多个逆序(不稳定)
3.选择类排序:每一趟在n-i+1(i=[1,n-1])个记录中选取关键字最小的记录作为有序序列中的第i个记录
a.简单选择排序(不稳定)
b.树形选择排序(稳定)
c.堆排序(弥补树形选择排序占用空间多的遗憾)(不稳定)
4.归并排序(分治思想):
a.分解。将一个长度为n的无序序列不断分解成两个规模大致相等的子序列,直到子序列大小为1.
b.合并。不断将两个有序子序列合并,得到一个新的有序序列。
分配类排序:利用分配和收集两种基本操作实现排序
a.多关键字排序
b.链式基数排序
c.基数排序(稳定)
A.堆排序
B.希尔排序
C.归并排序
D.快速排序
稳定的排序:直接插入排序、冒泡排序、归并排序、基数排序
A.插入排序
B.选择排序
C.快速排序
D.归并排序
A.O(N)
B.O(NlogN)
C.O(N2)
D.O(N2logN)
A.O(logN)
B.O(N)
C.O(NlogN)
D.O(N2)
A.79,46,56,38,40,80
B.84,79,56,46,40,38
C.84,56,79,40,46,38
D.84,79,56,38,40,46
堆排序是基于最大堆来实现的。
- 将待排序的数据看作一棵完全二叉树,将第一个数据作为二叉树的根,从左至右依次填充二叉树。
- 对这棵完全二叉树进行调整建堆,即父节点不小于两个子节点为原则。
- 重建堆:将根节点46移出作为待调整节点,然后对根节点的左右子树重建堆。根据得出的树图来看左子树不变,右子树84和56交换位置。
- 从84和79选择较大的84同待调整的46做比较,将84上移到根节点。
- 将56和待调整的46做比较,56上移到空节点处,46移到56位置处。
所以最终的初堆序列为:84,79,56,38,40,46
A.{38,46,79,56,40,84}
B.{38,79,56,46,40,84}
C.{38,46,56,79,40,84}
D.{40,38,46,56,79,84}
?
A.13,27,38,49,50,65,76,97
B.49,13,27,50,76,38,65,97
C.49,76,65,13,27,50,97,38
D.97,76,65,50,49,38,27,13
长度为4的序列:
{49,76} {38,13} {65,27} {97,50}
从小到大进行排序:
{49,76} {13,38} {27,65} {50,97}
所以最后第一趟排序,先输出左半部分,再输出右半部分
49 13 27 50 76 38 65 97?
A.冒泡排序
B.直接选择排序
C.堆排序
D.快速排序
A.1000
B.999
C.500
D.10
二分插入排序:最好情况:o(nlog(n))? ?最坏情况(o(n*n))
log2(10000)+1=10
2^10=1024
A.7
B.14
C.21
D.49
n*(n-1)/2;
即:7*6/2=21