网站建设有哪些项目网络营销的50种方法
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、不使用IF语句的两数排序方法
- 二、不使用IF的多数排序讨论
- 1、三数比较和排序
- 2、多个数据比较和排序
- 总结
前言
这个题目源于已经完成了不使用IF语句对两个数的比较大小,现在推广一下,能不能不使用IF语句完成一个普通的排序呢?本文就改题目进行一个尝试。
一、不使用IF语句的两数排序方法
我们使用伪代码或者C#进行编码,要求外代码支持所有主流语言的语法,但是不支持IF语句以及三目比较运算符。其实三目比较运算符也是一个变形的IF语句,这个本质上不符合我们的要求。
不使用IF语句的两数比较代码如下:
int[] x = new int[] { 100, 90};int [] rslt = new int[2] ;var big = x[(1 - Math.Sign(x[0] - x[1])) / 2];var small = x[(1 - Math.Sign(x[1] - x[0])) / 2];var result = string.Format("big = {0}, small = {1}", big,small);txt_resutl.Text = result;
上述方法将大数保存到big中,将小数保存到small中, 这样big 和small就构成一个有序序列,我们的问题是能否利用某种方法扩充这个有序序列,如果可以,那么排序就完成了。
二、不使用IF的多数排序讨论
1、三数比较和排序
不是一般性我们以整数为例进行数据的比较。
那么一个两数的有序序列表示如下
int[] ints = new int[] {1, 2,};
现在我们思考,如何将第三个数插入到这个数组中。
分析上面两数比较的过程,可知
1 - Math.Sign(x[0] - x[1])) / 2
表示的是大数数组元素的下标 另外一个是小数组元素的下标,这样得到链表排序的两数比较函数如下:
static public int[] Compare2Number(int[] n){int[] rsult = new int[2];//for (int i = 0; i < cn.Length; i++)//{// rsult[i] = cn[i];//}var n1 = n[0];var n2 = n[1];var idxA = (1 - Math.Sign(n1 - n2)) / 2;// the index of greater one var idxB = (1 - Math.Sign(n2 - n1)) / 2;// the index of the less onersult[0] = n[idxA];rsult[1] = n[idxB];return rsult;}
利用两数比较的函数,我们思考如何将第三个数放到这个有序队列 baseN 中。可以将第三个数与有序序列baseN 的第一个元素比较,生成一个新的有序序列 r1, 再将r1的第二个元素与baseN的第二个数进行比较,生成另一个有序序列r2。此时
r1[0], r2[0], r2[1] 就是三个元素的排序结果。
代码如下:
int[] baseN = new int[] { 1,2};int x3 = 3;var r0 = NoIFSort.Compare2Number(baseN);int[] x1 = new int[2];x1[0] = r0[0];x1[1] = x3;var r1 = NoIFSort.Compare2Number(x1);int[] x2 = new int[2];x2[0] = r1[1];x2[1] = r0[1];var r2 = NoIFSort.Compare2Number(x2);int[] rslt = new int[3];rslt[0] = r1[0];rslt[1] = r2[0];rslt[2] = r2[1];
上述代码将结果整合到一个新的序列中。
2、多个数据比较和排序
三数的比较是将第三个数与有序序列baseN 的第一个元素比较,得到一个2元序列,再将最后一个元素与有序序列的第二个元素比较,再得到一个2元序列,恻然生成一个三元有序序列。可以看出,将这个三元序列作为已知有序序列,就可以比较第四个数。这样推而广之,就可以进行能个数的比较。综上分析,可以写出一个数和n个数进行比较排序的代码:
static public int[] GetNewOrderSeq(int newX, int[] nSorted,int nSLen){int[] rsult = new int[nSLen+1];var x = newX;for(int i = 0; i < nSLen; i++){int[] cn = new int[2];cn[0] = x;cn[1] = nSorted[i];var new2Cn = Compare2Number(cn);rsult[i] = new2Cn[0];x=new2Cn[1];}rsult[nSLen] = x;return rsult;}
改函数的功能,将一个新数和已知有序序列进行比较,并且生成一个新的有序序列,nSLen 有序序列的长度。
在该函数的基础上,我们对需要排序的序列进行遍历,将元素从头到位一个一个地插到这个序列中,最终这个序列就是一个排好序的有序序列,从而实现对一组数的排序功能。
代码如下:
int[] ints = new int[] {1, 2, 4, 3, 5, };int[] nSorted = new int[ints.Length];nSorted[0]=ints[0];for (int i = 1; i < ints.Length; i++){var newX = ints[i];nSorted = NoIFSort.GetNewOrderSeq(newX, nSorted,i);}
上面代码使用两个数组,第一个数组保存需要排序的数据,第二个数组保存排序好的数据。
这样我们在不使用IF语句的限制下,完成了一个数组的排序。
PS: 上述代码在C#调试通过。
总结
不使用IF语句比较两个数的大小是本人在多年以前刚刚开始接触计算机的时候碰到的一个题目,当时使用Basic 实现。去年本人把数据结构又看了一遍深受里面名人大咖思想的影响和鼓舞,就一直想在算法上面做些实验。不使用IF语句进行排序也是最近才有的想法,隐约感觉是可以的。经过半天的探索终于实现,是记。
MaraSun BJFWDQ