冒泡排序和选择排序的效率问题

1.先看看我这个算不算选择排序,因为我写的这个会出现自己跟自己交换的时候2.我自己感觉选择排序和冒泡排序在面对倒序的数据时效率是一样的,其他时候选择排序效率稍好点。我的想法对吗?(别给我粘代码)
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
int str[11];
int i,j,k,t;
for(i=1;i<11;i++){cin>>str[i];}//输入10个数;
for(i=1;i<11;i++)//控制被比较数滑动
{
for(j=i+1;j<11;j++)//控制比较
{str[i]<str[j]?t=str[i],k=i:t=str[j],k=j;/*比较*/t=str[i];str[i]=str[k];str[k]=t;} //交换
}
for(int u=1;u<11;u++){cout<<str[u];}cout<<endl;
return 0;
}

选择排序总是会比冒泡排序效率高,因为选择排序每轮至多只交换1欢,但从算法角度考虑,时间复杂度并没有什么改进,因为都是O(n^2)算法!追问

我这个算选择么

追答

应该是吧,冒泡排序遇到一个需要交换的就交换一次。
遇到比当前最大值(降序)大的,或比当前最小值小的升序就交换一次。

选择每次选一个最大值(降序)或最小值交换(升序)。
你这个明显是这么做的!

不过冒泡的改进算法效率也不低。就是记录交换次数的方法。

选择排序由于每次只交换一个,比简单的冒泡效率高。
但是你这个效率也不是很好!

好一点的选择排序,
只需要记录最大值(降序)或最小值交换(升序)的位置,
就行了,不要赋值这一步了。

另外C数组下标,都是从0开始计数的;
所以如无特殊需要。一般从0开始!
你这里11个字符只有1~10 是有用数据
第0个字符没有用到!
只有某些比较原始的,插入排序算法,才是从1开始的;0留出来另有用途(是叫哨兵吧!)。

由于你这里是字符数组,
所以算法上最好的,不一定就是最好的!

从算法来说,下面这样的小小改动是比较好的!
for(i=1;i<11;i++)//控制被比较数滑动, .......... 一共进行10轮比较。
{
k=i; //.......k就是最大值的下标,先假设最大值在i;
for(j=i+1;j<11;j++) //控制比较.............比较 10-i次;
if(str[k]<str[j])k=j; //改进的选择排序算法。这个是降序,选最大的,只有遇到更大的,才改变k!
if(k!=i) //i是最大值时不交换;在这里使用,提高不了多少效率,只是从算法上说更好些!
{ t=str[i];str[i]=str[k];str[k]=t; }//最大值从k,交换到i;这一步没什么花样!
}
更好的选择排序,是希尔排序(shellsort)或者叫歇尔排序,
最好的希尔排序,时间复杂度O(N^(4/3));
这个就看数据结构和算法方面的书吧!
少了 k=i;//这一步,可是内循环里 多了这么多代码 str[i]<str[j]?t=str[i],k=i:t=str[j],k=j;
虽然用了?运算符可是,至少需要两个赋值操作。
这里数据尺寸较小不算什么,一旦数组中的数据尺寸较大就很不划算了!
k=i 就不同了,不管数据如何,只是一个整数赋值操作而已。
最好的内部排序算法好像是快速排序吧!
最好的外部排序算法是归并排序!

温馨提示:内容为网友见解,仅供参考
第1个回答  2020-12-24

经典排序之冒泡排序

冒泡排序和选择排序区别
3、比较方式:冒泡排序是比较相邻的元素,而选择排序是按顺序比较,找最大值或者最小值。4、效率:在一般情况下,选择排序的效率高于冒泡排序。这是因为选择排序的交换次数较少,而冒泡排序可能需要多次交换才能达到排序的目的。

VB冒泡排序法和选择排序法的优缺点比较
冒泡排序,在每一次比较的时候,如果发现相邻两数的次序不对,都会马上就把两数进行对调。选择排序,则在比较过程中(内循环里面)并不进行对调,而是先记录下最小(大)数的下标,在一次扫描完成后再进行对调。所以它的效率会比冒泡的高一点。但是冒泡排序是“稳定的”排序。就是说同样总分的若干名同学...

冒泡与选择有哪些异同呢?
冒泡排序和选择排序的时间复杂度,空间复杂度都是相同的,他们的外层循环次数,乃至总的比较次数也是相同的。不同的地方在于,大多数情况下选择排序的交换操作次数会比冒泡更少,会高那么一点运行效率,再一个冒泡排序是稳定的(前提是相等的数据不进行互换),选择排序是不稳定的。冒泡算法的逻辑在于,让...

关于数据结构排序算法的问题
选择排序 插入排序:每次比较后最多移掉一个逆序,因此与冒泡排序的效率相同。但它在速度上还是要高点,这是因为在冒泡排序下是进行值交换,而在插入排序下是值移动,所以直接插入排序将要优于冒泡排序。直接插入法也是一种对数据的有序性非常敏感的一种算法。在有序情况下只需要经过n-1次比较,在最坏...

冒泡排序和选择排序的不同之处有哪些?
冒泡排序和选择排序的根本区别就是 1)选择选好了(最大或最小元),需要交换(最大或最小元和当前元素不在同一位置),才交换,是选择排序;2)比较完成,需要交换就交换(元素逆序,则交换)。是冒泡选择排序;举例 选择排序:升序 i 自小到大 i前面的是已经排好序的数据。选一个当前位置i 以后...

选择排序算法与冒泡排序算法有何异同啊?
选择排序,是a[0]和a[1],a[2],a[3]依次比较,遇到小的就交换,这样一次下来,最大的被保存在了a[0].下次排序就从a[1]开始重复以上步骤。冒泡排序,是a[0]和a[1]比较,小的就交换。然后a[1]和a[2]比较,小的交换。然后a[2]和a[3]比较小的就交换。这样一次下来,最大的被保存在a...

选择排序和冒泡排序有什么区别
1、稳定性不同:冒泡排序是稳定的排序,而选择排序是不稳定的排序。2、交换成本不同:冒泡排序需要相邻元素比较,如果当前元素大于后一个元素进行交换,而选择排序只需换一次位置。3、顺序不同:冒泡排序是比较相邻位置的两个数,而选择排序是按顺序比较,找最大值或者最小值。4、优缺点不同:冒泡排序...

...的排序方法有哪些?比较一下冒泡排序和选择排序算法上的异同。_百...
不同之处:1、操作方式不同:冒泡排序是依次比较相邻元素的大小,如果顺序错误就交换位置;而选择排序是每次从待排序的序列中选择最小(或最大)的一个元素,然后与第一个元素交换位置。2、效率不同:由于冒泡排序每次只能交换一个元素,因此它的效率相对较低;而选择排序每次可以交换多个元素,因此它的...

选择排序和冒泡排序的区别是什么?
1、冒泡排序是左右两个数相比较,而选择排序是用后面的数和每一轮的第一个数相比较;2、冒泡排序每轮交换的次数比较多,而选择排序每轮只交换一次;3、冒泡排序是通过数去找位置,选择排序是给定位置去找数;4、当一个数组遇到相同的数时,冒泡排序相对而言是稳定的,而选择排序便不稳定;5、在时间...

冒泡排序法和快速排序比较的算法
产生1000个随机数,分别用两种方法来进行排序。给出各自的排序思路。要求比较冒泡排序和快速排序的效率,给出各自的排序时间及结果,交:1.程序的代码(冒泡、快速)2.给出时间3.前20... 产生1000个随机数,分别用两种方法来进行排序。给出各自的排序思路。要求比较冒泡排序和快速排序的效率,给出各自的排序时间及结果,...

相似回答