这个excel排序错误法错误了吗?

扫二维码下载作业帮
拍照搜题,秒出答案,一键查看所有搜题记录
下载作业帮安装包
扫二维码下载作业帮
拍照搜题,秒出答案,一键查看所有搜题记录
c语言的一个和选择排序法有关的问题选择排序法为什么不能直接简化为下面这段程序?for(i=0;i
扫二维码下载作业帮
拍照搜题,秒出答案,一键查看所有搜题记录
你给出这个排序算法也是选择排序,但你的这个选择排序性能相对较低,所以一般不用这个程序.网友Jack218338与NE_Z说它是冒泡都是错误的说法,冒泡排序中的交换数据,都是发生在相邻的两个数据之间出现逆序时进行,而选择排序未必,比如你给出的程序中交换数据就未必是发生在相邻的两个数据之间.常用的选择排序是对你的这个选择排序的改进,性能比你的这个要优的.提供冒泡与选择的几个版本,楼主你可以比较一下.1、性能较低的冒泡for(i = 0; i < n - 1; i++)
for(j = j > j--)
if(b[j - 1] > b[j]) Swap(b[j - 1], b[j]); /*交换都是发生在相邻的两个元素之间*/ 2、性能较低的选择for(i = 0; i < n - 1; i++)
for(j = i + 1; j < j++)
if(b[i] > b[j])
Swap(b[i], b[j]);
/*b[i]与b[j]未必相邻*/ 3、改进后的冒泡for(i = 0; i < n - 1; i++) {
exchange = 0;
for(j = j > j--)
if(b[j - 1] > b[j]) {
Swap(b[j - 1], b[j]);
exchange = 1;
if(exchange == 0)
/*如果某趟冒泡过程中没有发生交换操作,则排序结束*/} 4、改进后的选择for(i = 0; i < n - 1; i++) {
for(j = i + 1; j < j++)
if(b[j] < b[min])
if(i != min)
Swap(b[i], b[min]); /*每趟只和最小元素进行交换*/}改进后的选择主要是为了减少数据交换的操作,从而提高排序效率.
为您推荐:
扫描下载二维码55623人阅读
算法设计(2)
&&& 尽管排列组合是生活中经常遇到的问题,可在程序设计时,不深入思考或者经验不足都让人无从下手。由于排列组合问题总是先取组合再排列,并且单纯的排列问题相对简单,所以本文仅对组合问题的实现进行详细讨论。以在n个数中选取m(0&m&=n)个数为例,问题可分解为:1. 首先从n个数中选取编号最大的数,然后在剩下的n-1个数里面选取m-1个数,直到从n-(m-1)个数中选取1个数为止。2. 从n个数中选取编号次小的一个数,继续执行1步,直到当前可选编号最大的数为m。很明显,上述方法是一个递归的过程,也就是说用递归的方法可以很干净利索地求得所有组合。下面是递归方法的实现:/// 求从数组a[1..n]中任选m个元素的所有组合。/// a[1..n]表示候选集,n为候选集大小,n&=m&0。/// b[1..M]用来存储当前组合中的元素(这里存储的是元素下标),/// 常量M表示满足条件的一个组合中元素的个数,M=m,这两个参数仅用来输出结果。void combine( int a[], int n, int m,& int b[], const int M ){&&for(int i=n; i&=m; i--)&& // 注意这里的循环范围&{&&b[m-1] = i - 1;&&if (m & 1)&&&combine(a,i-1,m-1,b,M);&&else&&&&&&&&&&&&&&&&&&&& // m == 1, 输出一个组合&&{&&&&&&for(int j=M-1; j&=0; j--)&&&&cout && a[b[j]] && & &;&&&cout &&&&}&}}
因为递归程序均可以通过引入栈,用回溯转化为相应的非递归程序,所以组合问题又可以用回溯的方法来解决。为了便于理解,我们可以把组合问题化归为图的路径遍历问题,在n个数中选取m个数的所有组合,相当于在一个这样的图中(下面以从1,2,3,4中任选3个数为例说明)求从[1,1]位置出发到达[m,x](m&=x&=n)位置的所有路径:1& 2& 3& 4&&& 2& 3& 4&&&&&&& 3& 4上图是截取n&n右上对角矩阵的前m行构成,如果把矩矩中的每个元素看作图中的一个节点,我们要求的所有组合就相当于从第一行的第一列元素[1,1]出发,到第三行的任意一列元素作为结束的所有路径,规定只有相邻行之间的节点,并且下一行的节点必须处于上一行节点右面才有路径相连,其他情况都无路径相通。显然,任一路径经过的数字序列就对应一个符合要求的组合。下面是非递归的回溯方法的实现:/// 求从数组a[1..n]中任选m个元素的所有组合。/// a[1..n]表示候选集,m表示一个组合的元素个数。/// 返回所有组合的总数。int combine(int a[], int n, int m){&& &m = m & n ? n :&int* order = new int[m+1];&&& &for(int i=0; i&=m; i++)& order[i] = i-1;&&&&&&&&&&& // 注意这里order[0]=-1用来作为循环判断标识&&int count = 0;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &int k =&bool flag =&&&&&&&&&& // 标志找到一个有效组合&while(order[0] == -1)&{& if(flag)&&&&&&&&&&&&&&&&&& // 输出符合要求的组合& {&& && for(i=1; i&=m; i++)&&&&&&&&&&&&&&&&&&& &&& cout && a[order[i]] && & &;&& cout &&&& count++;&& flag =& }
& order[k]++;&&&&&&&&&&&&&&& // 在当前位置选择新的数字& if(order[k] == n)&&&&&&&&& // 当前位置已无数字可选,回溯& {&& order[k--] = 0;&&& }&&&& & & if(k & m)&&&&&&&&&&&&&&&&& // 更新当前位置的下一位置的数字&&&&&&&&& & {&& order[++k] = order[k-1];&&& }& & if(k == m)&& flag =&}
&delete[]&}
下面是测试以上函数的程序:int main(){&const int N = 4;&const int M = 3;&int a[N];&for(int i=0;i&N;i++)&&a[i] = i+1;
&// 回溯方法&cout && combine(a,N,3) &&&
&// 递归方法&int b[M];&combine(a,N,M,b,M);&
&return 0;}由上述分析可知,解决组合问题的通用算法不外乎递归和回溯两种。在针对具体问题的时候,因为递归程序在递归层数上的限制,对于大型组合问题而言,递归不是一个好的选择,这种情况下只能采取回溯的方法来解决。
&&& n个数的全排列问题相对简单,可以通过交换位置按序枚举来实现。STL提供了求某个序列下一个排列的算法next_permutation,其算法原理如下:1. 从当前序列最尾端开始往前寻找两个相邻元素,令前面一个元素为*i,后一个元素为*ii,且满足*i&*ii;2. 再次从当前序列末端开始向前扫描,找出第一个大于*i的元素,令为*j(j可能等于ii),将i,j元素对调;3. 将ii之后(含ii)的所有元素颠倒次序,这样所得的排列即为当前序列的下一个排列。其实现代码如下:template &class BidirectionalIterator&bool next_permutation(BidirectionalIterator first, BidirectionalIterator last) {& if (first == last)&&&// 空範圍& BidirectionalIterator i =& ++i;& if (i == last)&&&&&&&// 只有一個元素& i =&&&&&&&&&&&&&&&&&&&&&&&&& // i 指向尾端& --i;
&for(;;) &{&&BidirectionalIterator ii =&&--i;&&// 以上,鎖定一組(兩個)相鄰元素&&if (*i & *ii)&&&&&&&&&&&&&&&&&&&& // 如果前一個元素小於後一個元素&&{&&&&BidirectionalIterator j =&&// 令 j指向尾端&&&while (!(*i & *--j));&&&&&&&&&&& // 由尾端往前找,直到遇上比 *i 大的元素&&&iter_swap(i, j);&&&&&&&&&&&&&&&& // 交換 i, j&&&reverse(ii, last);&&&&&&&&&&&&&& // 將 ii 之後的元素全部逆向重排&&&&&}&&if (i == first)&&&&&&&&&&&&&&&&&& // 進行至最前面了&&{&&&&reverse(first, last);&&&&&&&&&&& // 全部逆向重排&&&&&}&}} 下面程序演示了利用next_permutation来求取某个序列全排列的方法:int main(){&int ia[] = {1,2,3,4};&vector&int& iv(ia,ia+sizeof(ia)/sizeof(int));&copy(iv.begin(),iv.end(),ostream_iterator&int&(cout,& &));&cout &&&while(next_permutation(iv.begin(),iv.end()))&{&&copy(iv.begin(),iv.end(),ostream_iterator&int&(cout,& &));&&cout &&&}&return 0;}注意:上面程序中初始序列是按数值的从小到大的顺序排列的,如果初始序列无序的话,上面程序只能求出从当前序列开始的后续部分排列,也就是说next_permutation求出的排列是按排列从小到大的顺序进行的。
&Copyright@戴维 2006.5&&于北京&
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:237358次
积分:2284
积分:2284
排名:第14736名
原创:35篇
评论:151条
(1)(1)(1)(1)(1)(1)(1)(2)(3)(2)(1)(2)(3)(5)(4)(4)(2)(2)(3)当前位置: &
& wps2016表格怎么快速自动排序?
wps2016表格怎么快速自动排序?
类别:&&大小:58.40MB语言:简体中文&&授权:免费软件
  之前我们都了解了,今天主要为大家带来的是表格怎样才能快速排序,在排序的过程中排序结果出现错误该怎么办,如果大家遇到了同样的问题可以采用这里的方法来解决一下哦。★★欢迎进入并收藏格子啦wps office 2016教程专区★★wps office 2016常见问题  wps2016表格怎么快速自动排序?  1.首先我们需要在wps2016表格中打开一篇工作表,点击功能区的”开始“选项卡。  2.找到“编辑”区域,然后在编辑区域里面选择“排序和筛选”。在弹出的下拉菜单中选择“自定义排序”命令。  3.接着窗口会弹出一个“排序”的对话框,在点击“列”下面的“主要关键字”的下拉按钮进行选择,在“排序依据”下面的下拉按钮选择“数值”,“次序”选项组下面选择“升序”然后点击“确定”如图所示:这里我们选择“数学”这一列进行升序。  4.设置完成后返回我们的工作表中,可以发现在数学的那一列中数据自小到大进行了升序。更多快速自动排序方法可以去看  wps2016表格自动排序错误怎么办?  一、文本文档格式化,复制数据后直接粘贴在txt的文本文档里,如下图。再将其复制粘贴到表格中,此种方法适用于数据量较小的情况。  二、、格式刷,wps表格中自带有格式刷,可以直接将数据转换为所需要的格式。此种方法适用于错误较少,且需要保留布局格式的情况。如下两图应用格式刷的前后对比。  使用格式刷的时候,可以按住shift键对整行或整列的数据进行格式化。  三、格式-&清除命令。在开始工具栏下,选择右侧的【格式】-&【清除】-&【格式】命令即可。当然,前提是得需要选定数据。  四、局部设置单元格格式和全局设置单元格格式,选定数据可以直接右键设置单元格对所需要的数据,进行处理。也可以在表格的左上角处右键单击设置单元格格式(全部的数据)。如下图  注意:  局部设置单元格格式和全局设置单元格格式需要重新对数据进行输入,其格式才能发生变化。这个时候直接选定数据复制到txt文本文档里,再粘贴到表格中原位置即可。综上所述,小编以为【格式】-&【清除】命令,更为简单的快捷,当然啦,这只是我的个人想法,仅供参考!  总结:以上就是小编为大家提供的全部的wps2016表格快速自动排序以及排序错误的解决方法了,大家是不是已经解决自己遇到的问题了呢? & &小编推荐: & & & & & &
上一篇 &:
下一篇 &:
文章链接:/tutorials/58116.html
(转载时请注明本文出处及文章链接)

我要回帖

更多关于 excel排序错误 的文章

 

随机推荐