#6088. gesp四级真题分类五:排序算法
gesp四级真题分类五:排序算法
五、排序算法(共31题)
1. 对 int a[] = {2,0,2,4,3,1,6},执行第一趟选择排序处理后 a 中数据变为 {0,2,2,4,3,1,6}。(判断题)
{{ select(1) }}
- 正确
- 错误
2. 下面代码实现了冒泡排序函数,则横线上应填写( )。
void swap(vector<int>& arr, int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
int bubble_sort(vector<int>& arr) {
for (int i = arr.size() - 1; i > 0; i--) {
bool flag = false;
// 在此处填入代码
{
if (arr[j] > arr[j + 1]) {
swap(arr, j, j + 1);
flag = true;
}
}
if (!flag) break;
}
}
{{ select(2) }}
for (int j = 0; j < arr.size() - 1; j++)for (int j = arr.size() - 1; j > 0; j--)for (int j = 0; j < i; j++)for (int j = i - 1; j <= 0; j--)
3. 上一题算法的时间复杂度为( )。
{{ select(3) }}
- O(n²)
- O(2n)
- O(1)
- O(n)
4. 下面代码实现了插入排序函数(升序),则横线上应填写( )。
void insertion_sort(vector<int>& nums) {
for (int i = 1; i < nums.size(); i++) {
int base = nums[i], j = i - 1;
// 在此处填入代码
{
nums[j + 1] = nums[j];
j--;
}
nums[j + 1] = base;
}
}
{{ select(4) }}
while (j >= 0 && nums[j] > base)while (j > 0 && nums[j] > base)while (j >= 0 && nums[j] < base)while (j > 0 && nums[j] < base)
5. 下面代码试图实现选择排序,使其能对数组 nums 排序为升序,则横线上应分别填写( )。
void selectionSort(vector<int>& nums) {
int n = nums.size();
for (int i = 0; i < n - 1; ++i) {
int minIndex = i;
for (int j = i + 1; j < n; ++j) {
if ( ) { // 在此处填入代码
minIndex = j;
}
}
// 在此处填入代码
}
}
{{ select(5) }}
nums[j] < nums[minIndex]和swap(nums[i], nums[minIndex])nums[j] > nums[minIndex]和swap(nums[i], nums[minIndex])nums[j] <= nums[minIndex]和swap(nums[j], nums[minIndex])nums[j] <= nums[minIndex]和swap(nums[i], nums[j])
6. 下面程序实现插入排序(升序排序),则横线上应分别填写( )。
void insertionSort(int arr[], int n) {
for (int i = 1; i < n; i++) {
int key = arr[i];
int j = i - 1;
while (j >= 0 && ) { // 此处
arr[j + 1] = arr[j];
j--;
}
// 此处
}
}
{{ select(6) }}
arr[j] > key和arr[j + 1] = keyarr[j] < key和arr[j + 1] = keyarr[j] > key和arr[j] = keyarr[j] < key和arr[j] = key
7. 关于插入排序的时间复杂度,下列说法正确的是( )。
{{ select(7) }}
- 最好情况和最坏情况的时间复杂度都是 O(n²)
- 最好情况是 O(n),最坏情况是 O(n²)
- 最好情况是 O(n),最坏情况是 O(2ⁿ)
- 最好情况是 O(n²),最坏情况是 O(2ⁿ)
8. 为了提高冒泡排序的效率,如果某轮"冒泡"中没有执行任何交换操作,说明数组已经完成排序,可直接返回结果,则两条横线上分别应该填写( )。
void bubbleSortwithFlag(vector<int>& nums) {
for (int i = nums.size() - 1; i > 0; i--) {
bool flag; // 在此处填入代码
for (int j = 0; j < i; j++) {
if (nums[j] > nums[j + 1]) {
swap(nums[j], nums[j + 1]);
// 在此处填入代码
}
}
if (!flag) break;
}
}
{{ select(8) }}
flag = false;和flag = false;flag = false;和flag = true;flag = true;和flag = false;flag = true;和flag = true;
9. 对数组 arr[]={5, 3, 8, 1} 进行升序排序,执行第一轮冒泡排序后数组 arr 中的内容为( )。
{{ select(9) }}
- 3, 5, 1, 8
- 3, 1, 5, 8
- 3, 5, 8, 1
- 5, 3, 8, 1
10. 对数组 arr[]={4,1,3,1,5,2} 进行冒泡排序(将最大元素放到最后),执行一轮之后是( )。
{{ select(10) }}
- {1,4,3,1,5,2}
- {1,3,1,4,2,5}
- {1,4,3,1,2,5}
- {4,1,3,1,5,2}
11. 给定数组 arr[] = {4,1,3,1,5,2},执行第一轮冒泡排序后数组 arr 中的内容为( )。
{{ select(11) }}
- 1,4,3,1,5,2
- 1,3,1,4,2,5
- 1,4,3,1,2,5
- 4,1,3,1,5,2
12. 下面代码实现了插入排序函数,则横线上应填写( )。
void insertion_sort(vector<int>& nums) {
for (int i = 1; i < nums.size(); i++) {
// 此处
while (j >= 0 && nums[j] > base) {
nums[j + 1] = nums[j];
j--;
}
nums[j + 1] = base;
}
}
{{ select(12) }}
int base = nums[i], j = i - 1;int base = nums[i], j = i;int base = nums[0], j = i - 1;int base = nums[0], j = i;
13. 关于排序算法的稳定性,以下说法错误的是( )。
{{ select(13) }}
- 稳定的排序算法不改变相等元素的相对位置
- 冒泡排序是稳定的排序算法
- 选择排序是稳定的排序算法
- 插入排序是稳定的排序算法
14. 某排序算法对如下数据排序(按score升序),则下面关于该排序算法稳定性的描述中,说法正确的是( )。
初始: (90,'A'), (90,'B'), (80,'C'), (90,'D') 排序后: (80,'C'), (90,'A'), (90,'B'), (90,'D')
{{ select(14) }}
- 不稳定,因为出现了相同分数
- 稳定,因为相同score的相对顺序保持为A在B前、B在D前
- 不稳定,因为C跑到前面了
- 无法判断
15. 下面代码试图把数组按升序进行“插入排序”,横线处应填写( )。
void ins(int a[], int n) {
for(int i = 1; i < n; i++) {
int key = a[i];
int j = i - 1;
while(j >= 0 && ) {
a[j+1] = a[j];
j--;
}
a[j+1] = key;
}
}
{{ select(15) }}
- a[j] < key
- a[j] > key
- a[j+1] > key
- a[j] == key
16. 对如下4个扑克牌进行排序,使用某排序算法按 value 排序后,结果为:{3,'D'}, {3,'B'}, {5,'A'}, {5,'C'},则这个排序算法是稳定的吗?
struct Card { int value; char suit; };
Card cards[4] = {{5,'A'}, {3,'B'}, {5,'C'}, {3,'D'}};
{{ select(16) }}
- 稳定,因为相同 value 的元素相对顺序保持不变
- 不稳定,因为 {3,'D'} 出现在 {3,'B'} 之前
- 无法判断
- 稳定,因为结果是有序的
17. 下面的函数 selectTopK() 实现从 n 个学生中选出前 k 名成绩最好的学生,则横线上应填写( )。
void selectTopK(Student students[], int n, int k) {
for (int i = 0; i < k; i++) {
int maxIdx = i;
for ( ) {
if (students[j].score > students[maxIdx].score) {
maxIdx = j;
}
}
if (maxIdx != i) {
swap(students[i], students[maxIdx]);
}
}
}
{{ select(17) }}
int j = 0; j < n; j++int j = i + 1; j < n; j++int j = i; j < n; j++int j = 1; j <= n; j++
18. 某游戏的排行榜系统需要实时更新玩家分数。每次只有一个玩家的分数发生变化,排行榜已经是按分数降序排列的。下面函数 updateRanking() 要实现上述功能,则两处横线上应分别填写( )。
void updateRanking(Player players[], int size, int playerIdx) {
Player updatedPlayer = players[playerIdx];
if (playerIdx > 0 && updatedPlayer.score > players[playerIdx - 1].score) {
int i = playerIdx;
while (____________________) {
players[i] = players[i - 1];
i--;
}
players[i] = updatedPlayer;
}
else if (playerIdx < size - 1 && updatedPlayer.score < players[playerIdx + 1].score) {
int i = playerIdx;
while (____________________) {
players[i] = players[i + 1];
i++;
}
players[i] = updatedPlayer;
}
}
{{ select(18) }}
i > 0 && updatedPlayer.score > players[i - 1].score和i < size - 1 && updatedPlayer.score < players[i + 1].scorei < size - 1 && updatedPlayer.score < players[i + 1].score和i > 0 && updatedPlayer.score > players[i - 1].scorei > 0 && updatedPlayer.score < players[i - 1].score和i < size - 1 && updatedPlayer.score < players[i + 1].scorei > 0 && updatedPlayer.score < players[i - 1].score和i < size - 1 && updatedPlayer.score > players[i + 1].score
19. 下面关于排序稳定性的描述,正确的是( )。
{{ select(19) }}
- 稳定性指算法的时间复杂度恒定
- 稳定排序保证相同元素的相对顺序不变
- 选择排序是稳定排序
- 插入排序不是稳定排序
20. 冒泡排序和插入排序都是稳定的排序算法。(判断题)
{{ select(20) }}
- 正确
- 错误
21. 插入排序在最好情况(已有序)下的时间复杂度是 O(n²)。(判断题)
{{ select(21) }}
- 正确
- 错误
22. 对数组 arr[5]={4,3,1,5,2} 进行升序排序,执行第一轮选择排序后数组 arr 中的内容是 {1,4,3,5,2}。(判断题)
{{ select(22) }}
- 正确
- 错误
23. 无论初始数组是否有序,选择排序都执行 O(n²) 次比较。(判断题)
{{ select(23) }}
- 正确
- 错误
24. 以下C++代码,尝试对有 n 个整数的数组 arr 进行排序。这个代码实现了选择排序算法。(判断题)
for (int i = 0; i < n - 1; ++i) {
int minIndex = i;
for (int j = i + 1; j < n; ++j) {
if (arr[j] < arr[minIndex])
minIndex = j;
}
if (minIndex != i)
swap(arr[i], arr[minIndex]);
}
{{ select(24) }}
- 正确
- 错误
25. 下面这段代码实现了选择排序算法。(判断题)
void sort(int a[], int n) {
for (int i = 1; i < n; i++) {
int x = a[i];
int j = i - 1;
while (j >= 0 && a[j] > x) {
a[j + 1] = a[j];
j--;
}
a[j + 1] = x;
}
}
{{ select(25) }}
- 正确
- 错误
26. 冒泡排序和插入排序都是稳定排序算法。(判断题)
{{ select(26) }}
- 正确
- 错误
27. 对整数数组 {4,1,3,1,5,2} 进行冒泡排序(将最大元素放到最后),执行一轮之后是 {4,1,3,1,2,5}。(判断题)
{{ select(27) }}
- 正确
- 错误
28. 虽然插入排序的时间复杂度为 O(n²),但由于单元操作相对较少,因此在小数据量的排序任务中非常受欢迎。(判断题)
{{ select(28) }}
- 正确
- 错误
29. 选择排序是稳定的排序算法。(判断题)
{{ select(29) }}
- 正确
- 错误
30. 冒泡排序在任何情况下的时间复杂度都为 O(n²)。(判断题)
{{ select(30) }}
- 正确
- 错误
31. 如果给定数据部分有序,插入排序通常比选择排序效率更高。(判断题)
{{ select(31) }}
- 正确
- 错误