| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5042 人关注过本帖
标题:选择排序法及其优化
只看楼主 加入收藏
巧若拙
Rank: 4
来 自:宁波余姚
等 级:业余侠客
威 望:1
帖 子:159
专家分:273
注 册:2014-8-24
结帖率:46.15%
收藏
已结贴  问题点数:5 回复次数:4 
选择排序法及其优化
选择排序法及其优化
巧若拙

选择排序基础算法是每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。
选择排序基础算法代码如下:
void SelectSort_1(int vec[], int n) //选择排序基础算法
{
    int i, j, min;
    int temp;
   
    for (i=0; i<n-1; i++)
    {
        min = i;
        for (j=i+1; j<n; j++)
        {
            if (vec[j] < vec[min])
            {
                min = j;
            }
        }
        
        if (min != i)
        {
            temp = vec[i];
            vec[i] = vec[min];
            vec[min] = temp;
        }   
    }
}

为了减少比较的次数,可采用每一趟扫描时,同时选出最大和最小值,这样逐步缩小扫描范围,直到只剩下一个元素。
    改进版本中有一点要注意:如果最大值在最左边,肯定要被移走,此时要转移到相应的新位置。
选择排序基础改进代码如下:
void SelectSort_2(int vec[], int n) //选择排序改进算法:同时选出最大和最小值
{
    int i, min, max, left, right;
    int temp;
   
    for (left=0, right=n-1; left<right; left++, right--)
    {
        min = left;
        max = right;
        for (i=left; i<=right; i++)
        {
            if (vec[i] < vec[min])
            {
                min = i;
            }
            else if (vec[i] > vec[max])
            {
                max = i;
            }
        }
        
        if (min != left)
        {
            temp = vec[left];
            vec[left] = vec[min];
            vec[min] = temp;
            
            if (max == left) //如果最大值在最左边,肯定要被移走,此时要转移到相应的新位置
            {
                max = min;
            }
        }   
        
        if (max != right)
        {
            temp = vec[right];
            vec[right] = vec[max];
            vec[max] = temp;
        }
    }
}
搜索更多相关主题的帖子: 元素 
2014-09-09 18:17
erty1001
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:331
专家分:1433
注 册:2014-8-31
收藏
得分:5 
简单说说吧:
这种算是复杂度不变的优化,可能代码的编程复杂度变了,但是呢实际程序需要的时间和空间开销仍然没有变
真正能够实现排序优化的,你如果继续研究你肯定会发现的。简单一个方向,使用分治,嘘别告诉别人哦
2014-09-09 18:46
巧若拙
Rank: 4
来 自:宁波余姚
等 级:业余侠客
威 望:1
帖 子:159
专家分:273
注 册:2014-8-24
收藏
得分:0 
楼上说的是快排吗?
我“同时选出最大和最小值”的算法在平均时间复杂度上应该是比单纯找最小值的算法好,是1.5n 和 2n的区别。
2014-09-10 08:01
追远731
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2016-7-19
收藏
得分:0 
2016-07-19 14:27
追远731
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2016-7-19
收藏
得分:0 
2016-07-19 14:27
快速回复:选择排序法及其优化
数据加载中...
 
   



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

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