| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2947 人关注过本帖, 7 人收藏
标题:对排序的一点研究(选择排序,交换排序,插入排序)。望补充。
只看楼主 加入收藏
waterstar
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:984
专家分:2810
注 册:2010-2-12
结帖率:80%
收藏(7)
已结贴  问题点数:100 回复次数:29 
对排序的一点研究(选择排序,交换排序,插入排序)。望补充。
最近看了些排序的东西,感觉收获挺多,不过就是不全,希望大家看了之后
说说自己的想法。
以下代码中,EleType是自定义的数据类型,这不是什么关键。
1、简单选择排序
思路:选择最小的数放在数组的前端。
代码如下:
程序代码:
void SelectSort(EleType a[],int n)  //a[n]是要排序的最后一个数
{
    int i,j,min;
    EleType temp;
    for(i=0;i<n-1;i++)
    {
        min=i;
        for(j=i+1;j<n;j++)   //找出最小的数字
            if(a[j]<a[min])
                min=j;
        if(min!=i)          //如果min和i不等,就交换
        {
            temp=a[min];
            a[min]=a[i];
            a[i]=temp;
        }
    }
}
代码很简单,理解起来也没什么难度。

2、直接插入排序
思路:把前面的序列作为已经排序好的序列,将未排序的数逐个插入到适当位置。
代码如下:
程序代码:
void InsertSort(EleType a[],int n)
{
    int i,j;
    EleType Flag;     //作为监视哨
    for(i=1;i<=n;i++)
    {
        Flag=a[i];    //要插入的数赋值给Flag,作为监视哨
        j=i-1;
        while(Flag<a[j])//寻找插入位置
        {
            a[j+1]=a[j];
            j--;
        }
        a[j+1]=Flag;    //将原a[i]中的值存入第j+1个位置
    }
}

3、折半插入排序
思路:与直接插入排序的不同仅仅在于查找插入位置的方法不同,用折半查找的方法,
代码就不贴了。

4、希尔排序
思路:将要排序的数据分组,相隔为d的数据做一组,组内做直接插入排序,缩小d的值,
循环排序,直至结束。
代码如下:
程序代码:
void ShellSort(EleType a[],int n)
{
    int i,j,d;
    EleType Flag;
    for(d=n/2;d>=1;d=d/2)
    {
        for(i=d;i<=n;i++)
        {
            Flag=a[i];        //监视哨
            j=i-d;     //j为同一组的i的前一个元素下标
            while(j>=0 && Flag<a[j])
            {
                a[j+d]=a[j];  //同一组内做简单插入
                j=j-d;
            }
            a[j+d]=Flag;
        }
    }
}
希尔算法十分巧妙,效率也比较高。

5、冒泡排序
思路:比较相邻两数的大小,如果位置不对就交换,就像气泡像上冒一样。
代码如下:
程序代码:
void BubbleSort(EleType a[],int n)
{
    int i,j,Last,flag,m,temp;
    Last=n-1;
    for(i=n;i>=2;i--)
    {
        flag=0;          //标记设置为0
        m=Last;         //记录最后交换的位置
        for(j=0;j<=m;j++)
            if(a[j]>a[j+1])
            {
                temp=a[j];
                a[j]=a[j+1];
                a[j+1]=temp;
                flag=1; //如果发生过交换,置1
                Last=j; //最后交换位置赋值给Last
            }
        if(flag == 0) break;//如果未发生交换,说明已排序完成,退出函数
    }
}
这是我最早会的排序方法,最简单,但是效率比较低。

6、快速排序
思路:将temp数放置在正确位置,左边的数都比它小,右边的数都比它大,然后递归
调用进行再次排序,直至结束。
代码如下:
程序代码:
void QuickSort(EleType a[],int Left,int Right)
{
    EleType temp;
    int i,j;
    i=Left;j=Right;temp=a[i];   //设置初始排序区
    while(i<j)
    {
        while(temp <= a[j])  //从右侧开始扫描
            j--;            //找到第一个小于基准记录的数据
        a[i]=a[j];           //覆盖
        while(a[i]<=temp)    //从左侧开始扫描
            i++;             //找到第一个大于基准记录的数据
        a[j]=a[i];           //覆盖
    }
    a[i]=temp;               //找到正确位置
    if(Left<i-1) QuickSort(a,Left,i-1);        //判断是否需要再排序
    if(i+1<Right) QuickSort(a,i+1,Right);
}
快速排序应该算是这些排序算法中效率最高的了。

用100个随机数据进行排序,比较移动次数和比较次数
         直接插入     折半插入     希尔排序     冒泡排序     快速排序     简单选择
比较次数  2666         257          401          4950         622          4950
移动次数  2864         2864         1407         7581         398          270
上面的数据很直观的看出了各个排序方法的差距。

还有其他排序方法希望补充补充,或者有什么深入想法也说说。





收到的鲜花
  • 观弈寒儒2011-02-20 17:58 送鲜花  5朵   附言:加点分
搜索更多相关主题的帖子: 东西 
2011-02-17 16:40
ansic
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:恍惚窈冥
等 级:城市猎人
帖 子:1543
专家分:5367
注 册:2011-2-15
收藏
得分:5 
收藏啦~~多谢楼主!!!

善人者,不善人之师;不善人者,善人之资。不贵其师,不爱其资,虽智大迷。
2011-02-17 16:43
pcbaichi
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:486
专家分:1185
注 册:2010-11-13
收藏
得分:5 
貌似还有堆排序

免费赠送河蟹一只
2011-02-17 17:00
卧龙孔明
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:59
帖 子:3872
专家分:684
注 册:2006-10-13
收藏
得分:10 
c语言中排序调用qsort()。另外qsort()其实有许多鲜有人知的“风骚”用法。恕不多言。

My Blog: www.aiexp.info
虽然我的路是从这里开始的,但是这里不再是乐土.感谢曾经影响过,引导过,帮助过我的董凯,飞燕,leeco,starwing,Rockcarry,soft_wind等等等等.别了,BCCN.
2011-02-17 17:12
点线面
Rank: 8Rank: 8
来 自:NO.-1
等 级:蝙蝠侠
帖 子:525
专家分:980
注 册:2011-1-3
收藏
得分:10 
很多排序算法无不围绕执行速度和一个存储空间两问题,提升执行速度,反而增大存储量,反之,亦是这样,所以在两者方面进行取舍。

小代码,大智慧
2011-02-17 18:05
huangapple
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:545
专家分:1790
注 册:2010-12-30
收藏
得分:5 
.

勤能补拙,熟能生巧!
2011-02-17 19:49
pcbaichi
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:486
专家分:1185
注 册:2010-11-13
收藏
得分:0 
回复 6楼 huangapple
楼上的是来打酱油的吧,哈哈

免费赠送河蟹一只
2011-02-17 19:54
waterstar
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:984
专家分:2810
注 册:2010-2-12
收藏
得分:0 
回复 4楼 卧龙孔明
qsort确实挺“风骚”的,就是用这感觉不习惯。

冰冻三尺,非一日之寒;士别三日,不足刮目相看!
2011-02-17 21:05
waterstar
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:984
专家分:2810
注 册:2010-2-12
收藏
得分:0 
回复 5楼 点线面

时间复杂度和空间复杂度,对排序算法尤其是突出。

冰冻三尺,非一日之寒;士别三日,不足刮目相看!
2011-02-17 21:06
waterstar
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:984
专家分:2810
注 册:2010-2-12
收藏
得分:0 
回复 7楼 pcbaichi
给个堆排序算法?

冰冻三尺,非一日之寒;士别三日,不足刮目相看!
2011-02-17 21:07
快速回复:对排序的一点研究(选择排序,交换排序,插入排序)。望补充。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018379 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved