> 输入一个无序整型序列Array,返回一个有序序列(从小到大)。Insert_Sort伪代码如下:
for j=2 To Array.length:
key = Array[j]
i = j -1
// 开始寻找key的正确位置
while i>0 and Array[i]>key:
Array[i+1] = Array[i]
i = i - 1
Array[i+1] = key
对于Array,我们将Array[1, 2, ..., j-1]视为已经排序好的序列、Array[j]视为正要寻找位置的元素、Array[j+1, j+2, ...., n]视为未排序的序列。
对于Array[j]和Array[j-1]: - Array[j] > Array[j-1] 说明位置已经正确 - Array[j] < Array[j-1] 位置进行交换。
思考(练习1):
- 1.1说明数组Array = [31, 51, 59, 26, 48, 51]在Insert_Sort的执行过程。
- 1.2重写Insert_Sort代码,使之输出降序序列。
- 1.3思考以下查找问题 - 输入:n个长度的Array,和一个整型v. - 输出:当 v存在Array中,返回true,否则返回false,写出线性的伪代码。
- 1.4给定长度为N的数组Array无序数组,找出Array的最小元素,与Array[0]进行位置交换找出Array的最小元素,与Array[0]进行位置交换。一直到对Array[n-1]项进行此操作。这样的算法称为选择排序(select sort)思考:
- 写出选择排序的伪代码,或者实现代码。 - 为什么选择排序只需要对n-1项而不是n项进行这样的操作。 - 用大O记法表示该算法的最好与最坏情况的运行时间。
1.5再次参考线性查找问题(参考练习1.3)。假定查找的元素等可能为数组中的任意元素,平均需要检查输入序列的多少元素?最好与最坏的情况呢?请用大O记法分别表示,平均,最好,最坏的运算时间。
1.6在插入排序中,在Array[j],寻找位置的时候,如何快速找到正确位置?
1.7如何修改任意一个算法,才能使之具有良好的最好情况允许时间?