首页 > 其他分享 >选择排序为什么是不稳定排序

选择排序为什么是不稳定排序

时间:2024-12-22 16:56:42浏览次数:5  
标签:为什么 稳定 元素 cin 索引 数组 排序 getline

选择排序为什么会不稳定:

在选择排序中,当我们在未排序的部分中选择最小(或最大)元素并交换到已排序部分时,如果未排序部分中有两个相同的值,这种交换操作可能会导致它们的相对顺序发生改变。

具体事例:

假设我们有以下数组,其中有两个相同的最大值 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函数,那为什么在连续使用的时候会有问题呢?这里我举例一段代码:

#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大佬啊,这些地方去搜下这个关键词

标签:为什么,稳定,元素,cin,索引,数组,排序,getline
From: https://blog.csdn.net/2401_87298262/article/details/144646258

相关文章

  • 12.22 归并排序
    includeusingnamespacestd;constintMAXN=10;intn,a[MAXN],b[MAXN];voidmergesort(int*a,intl,intr){inti,j,mid,cnt;if(l==r){return;//TODO}mid=(l+r)/2;mergesort(a,l,mid);mergesort(a;mid+1;r)i=l,j=mid+1,cnt=......
  • 希尔排序(n/3+1)
    #define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>#include<stdlib.h>#include<math.h>#include<string.h>#include<ctype.h>#include<time.h>#defineMAX_LENGTH100 voidShellSort(intarr[],intn){   intgap=......
  • 排序链表(归并排序)
    给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。 示例1:输入:head=[4,2,1,3]输出:[1,2,3,4]示例2:输入:head=[-1,5,3,4,0]输出:[-1,0,3,4,5]示例3:输入:head=[]输出:[] 方法一:归并排序/***Definitionforsingly-linkedlist.*s......
  • 各大排序总结
    因为学了冒泡后就会用sort了,完全没有学过各种排序,第一次面试因为不会手写快排GG,痛定思痛,决定认真写篇学习博客QAQ冒泡排序时间复杂度$O(n^2)$,空间复杂度$O(1)$,不断swap把大的排到后面,咕噜咕噜冒泡泡voidBubbleSort(int*a,intlen){for(inti=1;i<len;++i){......
  • 【唐叔学算法】第18天:解密选择排序的双重魅力-直接选择排序与堆排序的Java实现及性能
    引言在数据排序的世界里,选择排序是一类简单而直观的算法,它通过不断选取未排序部分中的最小(或最大)元素来逐步构建有序序列。今天,我们将深入探讨两种基于选择思想的排序方法——直接选择排序和堆排序,并提供它们的Java实现代码。此外,我们还会分析这两种排序算法的时间复杂度和......
  • 为什么在PbootCMS中需要进行域名URL权重集中处理?
    在PbootCMS中进行域名URL权重集中处理是非常重要的,这有助于提升网站的SEO效果。具体原因如下:避免权重分散:当一个网站同时绑定了多个域名(如带www和不带www的域名),搜索引擎会将这些不同的URL视为不同的页面。即使这些页面内容相同,搜索引擎也会分别计算它们的权重,导致权重分散。......
  • lambda排序小记
    一、按照几个字段分别排序:Student:packagecom.model;importlombok.AllArgsConstructor;importlombok.Getter;importlombok.Setter;importlombok.ToString;@Getter@Setter@ToString@AllArgsConstructorpublicclassStudent{privateStringname;priv......
  • 78.一维数组和二维数组的排序实现
    因为碰到了一些题目故此来做总结一维数组最常用的冒泡排序:#include<stdio.h>voidsort(intarr[],intn){//外层循环for(inti=0;i<n-1;++i){intflag=1;//假设flag=1就是已经排序好的//内层循环for(intj=0;j<n-1-i;......
  • 你认为什么样的前端代码才是最好的?
    在前端开发中,"最好的代码"并没有一个绝对的定义,因为它取决于多种因素,包括项目的具体需求、团队的技术栈和偏好、以及代码的可读性、可维护性和可扩展性。然而,以下是一些广泛接受的优秀前端代码的特征:清晰性和可读性:代码应该清晰易懂,使得其他开发者(或未来的你)能够轻松理解代码的......
  • pta 7-363 sdut-C语言实验-简单字符串排序
    题解:#include<iostream>#include<string>usingnamespacestd;//定义学生结构体structstudent{stringname;intscore;};//快速排序实现单词字典序排序voidQuickSort(studentstu[],intleft,intright){if(left>=right)return;inti=left,j=r......