排序
内部排序
-
插入排序
-
直接插入排序
1 思想:查找出L(i)在L[1-i-1]中插入的位置,移动L[k]后所有的元素一个位置,将L[i]复制到L[k]上
2 例题
用直接插入排序算法对下列4个表进行从小到大排序,比较次数最少的是()
A. 94,32,40,90,80,46,21,69
B. 21,32,46,40,80,69,90,94
C. 32,40,21,46,69,94,90,80
D. 90,69,80,46,21,32,94,403 总结:适用于顺序存储和链式存储
-
折半插入排序
1 思想:利用二分法的思想。需要做两步工作:找到待插入元素的位置、插入。 两个指针low和high用于寻找a[i]的插入位置,low指向a[0],high指向a[i-1],中点mid=(low+high)/2
2 总结:该比较次数与待排序标的初始状态无关,仅取决于表中的元素个数
-
希尔排序(又称缩小增量排序)
1 思想:先将待排序表分割成若干个特殊的子表,分别进行直接插入排序, 当整个表中元素已呈基本有序时,再对全体记录进行一侧直接插入排序。
2 例题
对序列{15,9,7,8,20,-1,4}用希尔排序方法排序,经一趟后序列变成{15,-1,4,8,20,9,7}则该次才用的增量是()
A. 1 B. 4 C. 3 D. 23 总结:仅适用于顺序存储
-
-
交换排序
-
冒泡排序
1 思想:假设待排序表长为n,从后往前(从前往后)两两比较相邻元素的值, 若为逆序(即A[i-1]>A[i]),则交换他们,直到序列比较完。
2 总结:冒泡排序中所产生的有序子列一定是全局有序的,也就是说有序子列中的所有元素的关键字小于或大于无序子列中所有元素的关键字,这样每一趟排序都会将一个元素放置到其最终的位置上。
-
快速排序
1 思想:分治法。 假设每次总是以当前表中的第一个元素作为枢轴值对表进行划分, 则必须将表中比枢轴值打的元素向右移动,比其小的向左移动,表中的元素被一分为二。 递归,分别对左边的元素和右边的进行相同的操作。
2 例题
用某种排序方法对线性表{25,84,21,47,15,27,68,35,20}进行排序时,元素序列的变化情况如下:
1)25,84,21,47,15,27,68,35,20
2)20,15,21,25,47,27,68,35,84
3)15,20,21,25,65,27,47,68,84
4)15,20,21,25,27,35,47,68,84
则所采用的排序方法是()
A. 选择排序 B. 插入排序 C. 二路归并排序 D. 快速排序3 总结:在快速排序算法中,并不产生有序子序列,但每一趟排序后将一个元素(基准元素)放到了其最终位置
-
-
选择排序
-
简单选择排序
1 思想:假设排序表为L[1-n],第i趟排序即从L[i-n]中选择关键字最小的元素与L[i]交换, 每一堂排序可以确定一个元素的最终位置,这样经过n-1趟就可以使得整个排序表有序
2 总结:简单排序过程中,元素移动的操作次数很少,不会超过3(n-1)次,最好的情况是0次。但是元素比较的次数和序列的初始状态无关
-
堆排序
1 思想:小顶堆和大顶堆,堆排序是一种树形选择排序方法, 利用完全二叉树中双亲节点和孩子节点之间的内在关系,在当前无序区中选择关键字最大或者最小的元素
2 例题
在含有n个关键字的小顶堆中,关键字最大的记录有可能储存在()
A. n/2 B. n/2+2 C. 1 D. n/2-13 总结:由于堆本身的特性,堆顶元素就是最大值(大顶堆为例子)
-
-
归并排序(2路归并)
1 思想:两两归并,得到长度为n/2向上取整(+1)个长度为2或者1的有序表; 再两两归并,如此重复,直到合并成一个长度为n的有序表为止
2 总结:对于N个元素,进行k-路归并排序时,排序的趟数m满足k的m次=N
-
基数排序
1 思想:采用多关键字排序,即基于关键字各位的大小进行排序
外部排序–多路归并排序
比较
答案 B,B,D,B