选择排序为什么会不稳定:
在选择排序中,当我们在未排序的部分中选择最小(或最大)元素并交换到已排序部分时,如果未排序部分中有两个相同的值,这种交换操作可能会导致它们的相对顺序发生改变。
具体事例:
假设我们有以下数组,其中有两个相同的最大值 7:
原始数组: [5, 7, 3, 7, 2]
复制
原始数组: [5, 7, 3, 7, 2]
plaintext
第一次迭代(寻找最小元素):
当前未排序部分是 [5, 7, 3, 7, 2]。
找到最小值 2(索引4),将其与索引0的元素 5 交换。
数组变为 [2, 7, 3, 7, 5]。
第二次迭代(寻找最小元素):
当前未排序部分是 [7, 3, 7, 5]。
找到 3(索引2),将其与索引1的元素 7 交换。
数组变为 [2, 3, 7, 7, 5]。
第三次迭代(寻找最小元素):
当前未排序部分是 [7, 7, 5]。
找到 5(索引4),将其与索引2的元素 7 交换。
数组变为 [2, 3, 5, 7, 7]。
观察结果:
在这个过程中,两个 7 的相对位置发生了变化,最初在 [5, 7, 3, 7, 2] 中,第二个 7 出现在第4个位置,而在排序后的数组 [2, 3, 5, 7, 7] 中,它们的顺序被保持,但由于是在找最大或最小值时发生了交换,可能会打乱其他相同元素的初始序列。
因此,选择排序是不稳定的,当相等元素的相对位置改变时,就出现了不稳定性。如果想要保持相等元素的相对顺序,可以使用稳定的排序算法,如归并排序(Merge Sort)或插入排序(Insertion Sort)。
昨日闲谈解答:
标签:为什么,稳定,元素,cin,索引,数组,排序,getline From: https://blog.csdn.net/2401_87298262/article/details/144646258昨天谈到了:(在不想用循环的条件下)想要直接将字符直接写入字符数组,可以借助cin.getline函数,那为什么在连续使用的时候会有问题呢?这里我举例一段代码:
#include <iostream> using namespace std; int main() { char a[20]; int c = 0; cin >> c; cin.getline(a, 20); cout << c << endl; cout << a << endl; }
这里我们可以很清晰的发现,cin.getline 把2和Hello!之间的空格也输入到了a数组里面,众所周知嗷,cin.getline函数直到遇到endl('\0'),才会结束吸收字符,也就是它只会把endl之前你输入的字符全部写入到a数组里面,剩下的endl会留在缓冲区,这里当我习惯性的输入2之后再输入回车键,会发现终端只会输出c的值,你本意其实是想通过回车键来区分你想要输入的内容,但是这个回车键(处于缓冲区)是直接被你的cin.getline函数给吸收了,cin.getline函数啥也没干,就直接碰到了回车键,就出怪了噻(出现问题)。 这里的告诉我们要注意cin.getline在读入前,缓存区是否有endl存在,这里我们可以有的手段就是:在cin.getline()前面,也就是 cin>>c 的后面,去添加一个cin.ignore() ,它的作用是清楚缓存区。
OK的呀!今日到此结束,缓存区是什么这个我的能力可能没办法说清楚,大家可以去b站啊CSDN大佬啊,这些地方去搜下这个关键词