| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 2618 人关注过本帖
标题:1.帮我证明单向选择排序的Min/Max最大赋值次数公式是对的,2.求根据不同数组 ...
取消只看楼主 加入收藏
huangzhenfan
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2012-7-15
结帖率:0
收藏
 问题点数:0 回复次数:4 
1.帮我证明单向选择排序的Min/Max最大赋值次数公式是对的,2.求根据不同数组长度求出Min/Max最大赋值次数的 组合一共有多少种的(公式)
程序代码:
void SelectSort(int a[])
{/* 第一次从待排序的数组元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾;以此类推,直到所有元素均排序完毕;
1.选择排序是不稳定的排序方法(相同数有可能因交换而改变原前后次序);5个元素选择排序为总次数为(4的等差数列之和)10次;
  一次比较两个数找出最小(大)元素:内循环比较最后1对数只需要1次;外循环每次再将比较范围缩小1个;
2.循环次数的等差数列求和公式:S = 1 +2 +3 +… +(n-1) +n;将n项加数反序:S = n +(n-1) +(n-2) +… +2 +1;将前两个公式正反序的加数1对1相加为:2S = (n+1)× n项;得S = (n+1)×n/2;
  如果n要减小一个数为:N×(N-1)/2;
3.4轮内循环次数统计:第一轮Select为[0]比较4次Traverse为[1~4],Select存新下标;第二轮Select为[1]比较3次Traverse为[2~4],Select存新下标;
  第三轮Select为[2]比较2次Traverse为[3~4],Select存新下标;第四轮Select为[3]比较1次Traverse为[4],Select存新下标;
4.交换次数:已经是有序状态如:12345,无需再交换;逆序时如:54321,交换n/2次,奇数量中间的元素不必交换(已遍历交换它的前后);
  最坏情况如:51234、53124及35214...所有位置都要换,交换n-1次(最后1对只交换一次);赋值总次数:交换次数×3
5.Select赋值次数:最好情况数列有序的 或全部相同是0次,最坏情况是反序(不会超过反序的,因为错的会减少赋值次数):
  每赋值一轮,赋值范围就缩小2个(公差为-2),总次数 = (项数:(N-1)/2) /2 × [2×(首项:(N-1)) + ((项数:(N-1)/2) - 1)×公差:-2]   + 外循环N-1次;  */
    unsigned LoopTotal = 0, SwapCount = 0, Select, SelectCount = 0;
    for (int Index = 0; Index < N - 1; ++Index)
    {
        Select = Index;
        for (int Traverse = Index + 1; Traverse < N; ++Traverse)
        {
            if (a[Select] > a[Traverse])// Select使用大于号是找出最小数,用小于号是找出最大数;
            {
                Select = Traverse;        // 交换下标只要赋值一次
                ++SelectCount;            // 统计Select被赋值总次数;最坏的情况是反序,每赋值一轮,赋值范围就缩小2个(公差为-2),用等差数列求和公式:总和 = (项数 / 2)x[2×首项 + (项数 - 1)×公差];再加外循环N-1次;
            }//最坏情况赋值总次数:#define N 6; (6-1)/2/2 * (2*(6-1) + ((6-1)/2-1) *-2 ) = 8.75次;精确到有小数为1次即9次; +5次 =14次        
            ++LoopTotal;                // 统计循环总次数:(n+1)*n/2;
        }
        if (Select != Index)            // Select值改变时才交换:每交换一个元素赋值为3次。1.用异或交换律; 
        {//已经是有序状态如:12345交换,每轮循环无需进行交换;逆序时如:54321,交换n/2次因奇数量中间的元素不必交换(已遍历交换该前后);最坏情况如:51234、53124及35214...所有位置都要换,交换n-1次(最后1对只交换一次)
            a[Select] ^= a[Index];        // 注意:不能自身与自身异或,否则为0;(含结果值)任意序的两两异或必定等于其第三值;
            a[Index] ^= a[Select];
            a[Select] ^= a[Index];
            ++SwapCount;                // 统计元素交换次数,每交换一次赋值3次
        }
    }
}
最多赋值次数:比如长度是5个元素的数列组合,就有6种如下所示的数列:
3,5,4,2,1
5,4,1,3,2
5,4,2,1,3
4,5,3,2,1
5,4,3,1,2
5,4,3,2,1




[此贴子已经被作者于2025-11-27 11:41编辑过]

搜索更多相关主题的帖子: 元素 次数 赋值 Select 交换 
2025-11-27 07:58
huangzhenfan
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2012-7-15
收藏
得分:0 
回复 2楼 rjsp
版主你好!
1.求助帮我证明根据不同数组长度求出Select被赋值最多数次的数列组合一共有多少种的(公式)
程序代码:
void SelectSort(int a[])
{
    unsigned LoopTotal = 0, SwapCount = 0, Select, SelectCount = 0;
    for (int Index = 0; Index < N - 1; ++Index)
    {
        Select = Index;
        for (int Traverse = Index + 1; Traverse < N; ++Traverse)
        {
            if (a[Select] > a[Traverse])
            {
                Select = Traverse;       
                ++SelectCount;            
            }
            ++LoopTotal;                 
        }
        if (Select != Index)           
        {
            a[Select] ^= a[Index];        
            a[Index] ^= a[Select];
            a[Select] ^= a[Index];
            ++SwapCount;                
        }
    }
}


我说的是Select被赋值最多次数,内循环Select被赋值最多次数计算公式为:(N-1)公差为2的等差数列求和,帮我证明他是对的,2.数组长度有5个元素及5个元素以上,比如1,2,3,4,5 这5个元素有120种组合,其中有6种组合是Select被赋值次数最多的,而6个元素有720种组合,其中有x种组合是Select被赋值最多次数的,帮我把这种数列组合数量的公式算出来(比如:6个元素时Select被赋值最多次数有多少种数列组合,7个元素时Select被赋值最多次数有多少种数列组合...,已知5个元素是6种)

比如长度是5个元素的数列组合,就有6种如下所示的数列,Select被赋值次数是最多的,在外循环Select被赋值为N-1次,在内循环Select最多赋值次数计算公式:(N-1)公差为2的等差数列求和;
如:
3,5,4,2,1 :第一轮循环:Select=3=2=1(内循环赋值两次),第二轮循环:Select=5=4=2(内循环赋值两次),第三轮循环:Select=4=3(内循环赋值一次),第四轮循环:Select=5=4(内循环赋值一次),内循环共6次赋值
5,4,1,3,2 :第一轮循环:Select=5=4=1(内循环赋值两次),第二轮循环:Select=4=3=2(内循环赋值两次),第三轮循环:Select=5=3(内循环赋值一次),第四轮循环:Select=5=4(内循环赋值一次),内循环共6次赋值
5,4,2,1,3 :第一轮循环:Select=5=4=2=1(内循环赋值三次),第二轮循环:Select=4=2(内循环赋值一次),第三轮循环:Select=4=3(内循环赋值一次),第四轮循环:Select=5=4(内循环赋值一次),内循环共6次赋值
4,5,3,2,1 :第一轮循环:Select=4=3=2=1(内循环赋值三次),第二轮循环:Select=5=3=2(内循环赋值两次),第三轮循环:Select=5=4(内循环赋值一次),内循环共6次赋值
5,4,3,1,2 :第一轮循环:Select=5=4=3=1(内循环赋值三次),第二轮循环:Select=4=3=2(内循环赋值两次),第三轮循环:Select=5=4(内循环赋值一次),内循环共6次赋值
5,4,3,2,1 :第一轮循环:Select=5=4=3=2=1(内循环赋值四次),第二轮循环:Select=4=3=2(内循环赋值两次),内循环共6次赋值

[此贴子已经被作者于2025-11-29 03:14编辑过]

2025-11-27 21:29
huangzhenfan
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2012-7-15
收藏
得分:0 
回复 4楼 yiyanxiyin
5个元素时,有6种组合是最多赋值次数,多数情况不倒序是最多赋值次数,有5种组合不是倒序,仅有一种组合是倒序,怎么证明数列的长度和最大赋值组合(组合的数量关系,比如5个元素已知6种组合是min最多赋值次数,6个元素时min最多赋值组合有多少个,7个元素时该组合有多少个...,帮我把公式算出来,就像证明全逆序的内循环赋值次数是公差为2的等差数列求和一样),谢谢!
主要DeepSeek和百度AI不给力,他们给出的所有公式都是错的,比如4个数列的min最多赋值次数为4次,百度AI为(n-1)*(n-2)/2=(4-1)*(4-2)/2=3次
图片附件: 游客没有浏览图片的权限,请 登录注册
图片附件: 游客没有浏览图片的权限,请 登录注册
图片附件: 游客没有浏览图片的权限,请 登录注册





[此贴子已经被作者于2025-11-29 03:27编辑过]

2025-11-29 01:16
huangzhenfan
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2012-7-15
收藏
得分:0 
回复 7楼 rjsp
首先感谢版主!
第一帮请您我证明最多赋值次数公式是对的,也就是说所有最多赋值的组合为什么不能超过全逆序的赋值次数
第二帮请您我证明最多赋值次数的组合数量随数列长度关系的公式

[此贴子已经被作者于2025-12-1 10:48编辑过]

2025-12-01 10:46
huangzhenfan
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2012-7-15
收藏
得分:0 
回复 9楼 yiyanxiyin
版主你好!
请您在数学和算法上证明,其它组合的最多赋值次数为什么要等于全逆序的,你如何确定更长的数列也是这样的情况

[此贴子已经被作者于2025-12-2 11:00编辑过]

2025-12-02 08:59
快速回复:1.帮我证明单向选择排序的Min/Max最大赋值次数公式是对的,2.求根据不同 ...
数据加载中...
 
   



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

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