插入排序、选择排序和冒泡排序的区别

上玄道 2010-11-26 09:46:19
最近也在做C的排序问题,碰到了很多种排序的方法,很头疼,看了诸葛兄的《插入排序和选择排序的区别》感觉不是很尽兴,特别是插入排序的部分还有不懂得地方,故在这里发表一些自己的分析,来和各位探讨我对这几种排序的认识,同时加入诸葛兄未提到得冒泡排序。

插入排序的原理:始终定义第一个元素为有序的,将元素逐个插入到有序排列之中,其特点是要不断的移动数据,空出一个适当的位置,把待插入的元素放到里面去。插入排序的函数如下:

insertion_sort(int *arr,int len)
{
    int i,j,tmp;
     for(i=1;i<len;i++)
     {
         j=i-1;
        tmp=arr[i];
         while(j>=0&&arr[j]>tmp)
        {
            arr[j+1]=arr[j];
             j--;
        }
        arr[j+1]=tmp;
    }
}

其中,arr为要排序的数组,len为数组的长度,j为数组下标,tmp为定义的要插入的数。可以看到,在while循环中,不断的去比较待插入的值与有序队列的值,不断的去移动数据,最后找到合适的位置,插入数据。



选择排序的原理:每次在无序队列中“选择”出最小值,放到有序队列的最后,并从无序队列中去除该值(具体实现略有区别)。代码如下:

selection_sort(int *arr, int n)
{
    int i,j,min,temp;
    for(i=0;i<n-1;i++)
    {
        min=i;
        for(j=i+1;j<n;j++)
    {

        if(arr[j]<arr[min])

        {
            min=j;
        }
     }
}

可以看出,选择排序的特点就是每次选出最小的放到有序队列最后。当然,也可以选出最大值放到有序队列的最前。



冒泡排序的原理:每次在无序队列里将相邻两个数依次进行比较,将小数调换到前面,逐次比较,直至将最大的数移到最后。最将剩下的N-1个数继续比较,将次大数移至倒数第二位。依此规律,直至比较结束。冒泡代码如下:

sort(int *arr,int n)
{
    int i,j,t;
    for(i=0;i<n-1;i++)
    {
        for(j=0;j<n-1-i;j++)
        {
            if(arr[j]>arr[j+1])
            {
                t=arr[j];
                arr[j]=arr[j+1];
                arr[j+1]=t;
            }
        }
    }
}

可以看到当把最大的数移至最后位置时,第二个for循环循环次数减一,即只比较最后位前的N-1位即可。

基本上这三种排序我已经为大家解说完了,因为我也还不是高手,所以有写错的地方,请大家见谅,同时有什么不懂得大家可以来找我共同探讨。

同时推荐大家看jackyjkchen的帖子《冒泡和选择排序该被踢出教材了》,上面有很多比这三种算吧更好的算法。
...全文
2242 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
星火燎猿 2011-04-09
  • 打赏
  • 举报
回复
支持冒泡排序...
iambic 2010-11-27
  • 打赏
  • 举报
回复
没啥好讨论的,知道怎么算就行了。
1+2+3也有不同的算法,你可以先算1+2,再算3+3,也可以先算2+3,再算1+5,也可以算(1+3)*3/2,也可以直接说sb等于6啊。
只要自己领会了,就是自己的了,就算把你的心得写出来,对别人其实也没什么帮助,因为还是要靠他自己领会,而领会的形态又根据每个人心脏的形状血流的速度而各有不同,无法互通。
当然,我这里说的不是算法本身的描述,而是你的所谓对算法的“理解”。
至善者善之敌 2010-11-27
  • 打赏
  • 举报
回复
算法掌握基本思想就好了,具体怎么写,你都有思想了还怕写不出来?
就想叫yoko 2010-11-27
  • 打赏
  • 举报
回复
建议楼主以后把这种帖子写成BLOG :)
上玄道 2010-11-27
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 q191201771 的回复:]
建议楼主以后把这种帖子写成BLOG :)
[/Quote]
哦,之前不知道,搞混了。感觉帖子的效果和BLOG是一样的,呵呵!
libinfei8848 2010-11-27
  • 打赏
  • 举报
回复
冒泡虽然没有实际应用了,但是是最容易理解的,所以教材应该由简入难熏熏渐进才行
liutengfeigo 2010-11-27
  • 打赏
  • 举报
回复

kingbigeast 2010-11-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 milkylove 的回复:]

冒泡这种O(n2)的算法就不要拿来比较了。不要给它太大压力。
[/Quote]
冒泡是我能想到最简单的稳定排序。
上玄道 2010-11-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 luciferisnotsatan 的回复:]
引用 3 楼 kingbigeast 的回复:

引用 1 楼 milkylove 的回复:

冒泡这种O(n2)的算法就不要拿来比较了。不要给它太大压力。

冒泡是我能想到最简单的稳定排序。

同意
冒泡排序在和插入比稳定性上表示 毫无压力
[/Quote]
是啊!通常笨方法都是比较稳定的。。。。。。
knightzhuwei 2010-11-26
  • 打赏
  • 举报
回复

好的
失落的凡凡 2010-11-26
  • 打赏
  • 举报
回复
冒泡这种O(n2)的算法就不要拿来比较了。不要给它太大压力。
luciferisnotsatan 2010-11-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 kingbigeast 的回复:]

引用 1 楼 milkylove 的回复:

冒泡这种O(n2)的算法就不要拿来比较了。不要给它太大压力。

冒泡是我能想到最简单的稳定排序。
[/Quote]
同意
冒泡排序在和插入比稳定性上表示 毫无压力

69,380

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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