请问选择排序法跟冒泡排序法有什么区别啊??

kkndciapp 2008-07-21 06:34:33
请问选择排序法跟冒泡排序法有什么区别啊??
...全文
64374 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
mqyyy777 2011-11-30
  • 打赏
  • 举报
回复
回复13楼楼主,我在port stl的源码里面没有看到bubble和select的sort实现,只看到了sort,实际是用的quick sort,和insertion_sort.请问楼主的源代码是在哪里找的?
Sun_Wu 2011-11-19
  • 打赏
  • 举报
回复
用双向冒泡,对60000个随机数排序,用于排序时间14.061秒
用选择,对60000个随机数排序,用于排序时间5.394秒
Intboy 2011-08-04
  • 打赏
  • 举报
回复
学习了啊。搞不清两者的真正区别……
sunalong95 2010-10-02
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 robust23 的回复:]

引用 5 楼 kkndciapp 的回复:
效率差不多吧,选择排序的查找和交换过程跟冒泡的次数差不多的吧

冒泡排序是每一次都可能要交换
而选择排序是在比较时记下a[i]的位置 最后来交换
所以他们的交换过程是不一样的 而查找的过程是一样的
效率不会比冒泡的低...
[/Quote]
这个说的好!言简意赅!
Robust23 2010-05-15
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 kkndciapp 的回复:]
效率差不多吧,选择排序的查找和交换过程跟冒泡的次数差不多的吧
[/Quote]
冒泡排序是每一次都可能要交换
而选择排序是在比较时记下a[i]的位置 最后来交换
所以他们的交换过程是不一样的 而查找的过程是一样的
效率不会比冒泡的低...
iambic 2008-09-20
  • 打赏
  • 举报
回复
学插入排序就够了。
moon&sean 2008-09-20
  • 打赏
  • 举报
回复
不错,很基础,但还真是不很清楚
yunzhbh 2008-09-17
  • 打赏
  • 举报
回复
很好啊,我得好好学习一下
stgzdcc 2008-09-17
  • 打赏
  • 举报
回复
领教了
skey006 2008-09-17
  • 打赏
  • 举报
回复
冒泡排序比较稳定,选择排序不稳定,两者的时间复杂度都是O(N^2).
danny1221 2008-09-17
  • 打赏
  • 举报
回复
注释是自己写的,不当之处大家指出.如侯Sir所说,"源码之前,了无秘密"
template <class T>
void bubble_sort( T a[], int n )
{ // 稳定的排序

// 交换标志exchanged,我们希望用这个标志减少不必要的扫描.
// 当它为真时,表明交换之前数组无序,但我们也不能确保在交换之后数组每一个
// 元素都排到有序状态下的正确位置了,所以再对数组进行扫描是必要的.
// 当它为假时,表明数组有序了,不必再对数组进行扫描了.
bool exchange = true; // 算法开始前,自然假设数组无序
for( int i = n - 1; i > 0 && exchange; --i ) { // 最多做n-1趟扫描
exchange = false; // 在一趟扫描开始前,我们总假设这趟扫描是不必要的
for( int j = 0; j < i; ++j ) { // 对当前无序区a[0:i]进行扫描
if( a[j+1] < a[j] ) {
std::swap( a[j+1], a[j] ); // 大的往下沉,而小的往上冒
exchange = true; // 发生了交换,故将交换标志置为真
}
}
}
}

template <class T>
void selection_sort( T a[], int n )
{ // 不稳定; 反例: { 2, 2, 1 }
int min;
for( int i = 0; i < n - 1; ++i ) { // 最多做n-1趟排序
min = i; // 先假设a[i]最小
for( int j = i + 1; j < n; ++j ) // 在当前无序区a[i:n-1]中查找最小值
if( a[j] < a[min] )
min = j; // min记下当前无序区最小值所在位置
if( min != i ) // 找到比当前a[i]更小者
std::swap( a[i], a[min] );
}
}
zhangzhao123 2008-09-17
  • 打赏
  • 举报
回复
不错
Sevenlight_x 2008-07-22
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 wangdeqie 的回复:]
原文章出处,对各种基本排序算法的分析,很不错的,推荐下!
http://www.vckbase.com/bbs/prime/viewprime.asp?id=145
[/Quote]

学习下
wangdeqie 2008-07-22
  • 打赏
  • 举报
回复
原文章出处,对各种基本排序算法的分析,很不错的,推荐下!
http://www.vckbase.com/bbs/prime/viewprime.asp?id=145
wangdeqie 2008-07-22
  • 打赏
  • 举报
回复
看下这个希望对你有帮助^_^

一、简单排序算法
由于程序比较简单,所以没有加什么注释。所有的程序都给出了完整的运行代码,并在我的VC环境
下运行通过。因为没有涉及MFC和WINDOWS的内容,所以在BORLAND C++的平台上应该也不会有什么
问题的。在代码的后面给出了运行过程示意,希望对理解有帮助。

1.冒泡法:
这是最原始,也是众所周知的最慢的算法了。他的名字的由来因为它的工作看来象是冒泡:

#include <iostream.h>

void BubbleSort(int* pData,int Count)
{
int iTemp;
for(int i=1;i<Count;i++)
{
for(int j=Count-1;j>=i;j--)
{
if(pData[j]<pData[j-1])
{
iTemp = pData[j-1];
pData[j-1] = pData[j];
pData[j] = iTemp;
}
}
}
}

void main()
{
int data[] = {10,9,8,7,6,5,4};
BubbleSort(data,7);
for (int i=0;i<7;i++)
cout<<data[i]<<" ";
cout<<"\n";
}


倒序(最糟情况)
第一轮:10,9,8,7->10,9,7,8->10,7,9,8->7,10,9,8(交换3次)
第二轮:7,10,9,8->7,10,8,9->7,8,10,9(交换2次)
第一轮:7,8,10,9->7,8,9,10(交换1次)
循环次数:6次
交换次数:6次

其他:
第一轮:8,10,7,9->8,10,7,9->8,7,10,9->7,8,10,9(交换2次)
第二轮:7,8,10,9->7,8,10,9->7,8,10,9(交换0次)
第一轮:7,8,10,9->7,8,9,10(交换1次)
循环次数:6次
交换次数:3次

上面我们给出了程序段,现在我们分析它:这里,影响我们算法性能的主要部分是循环和交换,
显然,次数越多,性能就越差。从上面的程序我们可以看出循环的次数是固定的,为1+2+...+n-1。
写成公式就是1/2*(n-1)*n。
现在注意,我们给出O方法的定义:

若存在一常量K和起点n0,使当n>=n0时,有f(n)<=K*g(n),则f(n) = O(g(n))。(呵呵,不要说没
学好数学呀,对于编程数学是非常重要的!!!)

现在我们来看1/2*(n-1)*n,当K=1/2,n0=1,g(n)=n*n时,1/2*(n-1)*n<=1/2*n*n=K*g(n)。所以f(n)
=O(g(n))=O(n*n)。所以我们程序循环的复杂度为O(n*n)。
再看交换。从程序后面所跟的表可以看到,两种情况的循环相同,交换不同。其实交换本身同数据源的
有序程度有极大的关系,当数据处于倒序的情况时,交换次数同循环一样(每次循环判断都会交换),
复杂度为O(n*n)。当数据为正序,将不会有交换。复杂度为O(0)。乱序时处于中间状态。正是由于这样的
原因,我们通常都是通过循环次数来对比算法。

3.选择法:
现在我们终于可以看到一点希望:选择法,这种方法提高了一点性能(某些情况下)
这种方法类似我们人为的排序习惯:从数据中选择最小的同第一个值交换,在从省下的部分中
选择最小的与第二个交换,这样往复下去。

#include <iostream.h>
void SelectSort(int* pData,int Count)
{
int iTemp;
int iPos;
for(int i=0;i<Count-1;i++)
{
iTemp = pData[i];
iPos = i;
for(int j=i+1;j<Count;j++)
{
if(pData[j]<iTemp)
{
iTemp = pData[j];
iPos = j;
}
}
pData[iPos] = pData[i];
pData[i] = iTemp;
}
}

void main()
{
int data[] = {10,9,8,7,6,5,4};
SelectSort(data,7);
for (int i=0;i<7;i++)
cout<<data[i]<<" ";
cout<<"\n";
}

倒序(最糟情况)
第一轮:10,9,8,7->(iTemp=9)10,9,8,7->(iTemp=8)10,9,8,7->(iTemp=7)7,9,8,10(交换1次)
第二轮:7,9,8,10->7,9,8,10(iTemp=8)->(iTemp=8)7,8,9,10(交换1次)
第一轮:7,8,9,10->(iTemp=9)7,8,9,10(交换0次)
循环次数:6次
交换次数:2次

其他:
第一轮:8,10,7,9->(iTemp=8)8,10,7,9->(iTemp=7)8,10,7,9->(iTemp=7)7,10,8,9(交换1次)
第二轮:7,10,8,9->(iTemp=8)7,10,8,9->(iTemp=8)7,8,10,9(交换1次)
第一轮:7,8,10,9->(iTemp=9)7,8,9,10(交换1次)
循环次数:6次
交换次数:3次
遗憾的是算法需要的循环次数依然是1/2*(n-1)*n。所以算法复杂度为O(n*n)。
我们来看他的交换。由于每次外层循环只产生一次交换(只有一个最小值)。所以f(n)<=n
所以我们有f(n)=O(n)。所以,在数据较乱的时候,可以减少一定的交换次数。

chlaws 2008-07-21
  • 打赏
  • 举报
回复
其实差不多,只不过选择是通过下标改动来排,冒泡则直接交换
chlaws 2008-07-21
  • 打赏
  • 举报
回复
其实差不多,只不过选择是通过下标改动来排,冒泡则直接交换
kkndciapp 2008-07-21
  • 打赏
  • 举报
回复
效率差不多吧,选择排序的查找和交换过程跟冒泡的次数差不多的吧
kkndciapp 2008-07-21
  • 打赏
  • 举报
回复

xkyx_cn 2008-07-21
  • 打赏
  • 举报
回复
上面说错了,是选择排序的平均时间复杂度比冒泡排序的稍低:
同样数据的情况下,2种算法的循环次数是一样的,但选择排序只有0到1次交换,而冒泡排序只有0到n次交换
加载更多回复(2)

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧