博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
各种算法总结一
阅读量:5163 次
发布时间:2019-06-13

本文共 13980 字,大约阅读时间需要 46 分钟。

各种算法总结一

   求出数组中的最大值,最原始的方式;方式一

static void FindMax03()        {            //数组中最大的一个数据,它肯定比数组中的每一个数都大,所以。。。就有了下面的算法了滴呀;            var arr = new int[6] { 40, 3320, 10, 242, 3450, 2 };            var len = arr.Length;            var max = 0;            for(var i=0; i < len; i++)            {                var temp = arr[i];                var times = 0;                for(var j = 0; j < len; j++)                {                    if (temp > arr[j])                    {                        //如果Temp 比数组中的每一数 都要大,那么,它一定是最大的数据了滴呀;                        times++;                    }                }                if (times == len-1)                {                    max = arr[i];  //那么这个数据就是我们的最大值滴哎呀;                    break;                }            }            Console.WriteLine("the max value is {0} ",max);        }

  求出数组中的最大的数;(方式二),这种方法大概就是,相邻的两个数据,进行比较,留下最大的一个数据,然后继续与下一个数据比较;

  反正每次比较之后,我们都留下了最大的那个数据滴啊;

static void GetMaxInt()        {            var arr = new int [5] {
40,20,30,40,50 }; var arrLen = arr.Length; int max = arr[0]; //在开始的第一步,我们自然认为:第一个数值最大的值; for (var i = 0; i < arrLen; i++) { if (arr[i] > max) //与第二个数据比较 { max = arr[i]; //这里隐藏着一个copy的操作; //始终保持手中的数 是最大的一个; } else { } } Console.WriteLine("max value={0}",max);

 当然有我们的额(方式三),这种方式,就是相邻连个数据记性比较,最大的数据往后面挪动,自然最大的一个数据就是我们的最大的一个数据;这种方式不借助中间变量,max

 这种方式,有点类似我们的额冒泡排序的感觉滴呀;

static void GetMax001()        {            var arr = new int[5] { 40, 20, 301, 40, 50 };            var arrLen = arr.Length;            for (var i = 0; i < arrLen-1; i++)            {                if (arr[i] > arr[i+1]) //把前面的一个数据和后面的一个数进行比较                {                    int temp = arr[i + 1];//中间变量                    arr[i + 1] = arr[i];  //位置交换,大的数据排在前面                    arr[i] = temp; //小的数据排在后面;                                   }            }            //这样同样能够找出我们的最大的数滴呀;                        Console.WriteLine("the seconde value is:{0}", arr[arrLen-1]);        }

当然有我们的额方式四滴呀,有点分区求最大值的想法,(这种思想有点类型我们的分组晋级练球赛的感觉滴呀;)

这种做法,仅仅使用了,循环次数的一半的滴呀,最大化的利用我们的循环效果滴呀;这里我们分额是两个区,当然也可以额分多个区,但是,分多了,就没多大意义了;

static void FindMax()        {            //基本思想就是讲数组分成两个区,            //分别求出每个区的最大值,然后进行各种比较滴呀;            //这里我们都求正整数滴呀;            //效果还是不错滴哦;            var arr = new int[6] { 40, 320, 32110, 2432, 3450 ,2};            var len = arr.Length;            var half = len / 2;            var rightMax = 0;            var leftMax = 0;            var max = 0;            for(var i = 0; i < half; i++)            {                if (arr[i]> rightMax)                {                    rightMax = arr[i];                }                if(arr[half + i]> leftMax)                {                    leftMax=arr[half+i];                }            }            //循环结束后,我们来进行两个区之间的各种比较滴呀;            if (rightMax > leftMax)            {                max = rightMax;            }            else            {                max = leftMax;            }            Console.WriteLine("the max value:{0}",max);                   }

接续优化

static void FindMax1()        {            //这种做法并没改变原始数组的大小,或则叫值吧;            var arr = new int[6] { 40, 320, 10, 24342, 3450, 2 };            var len = arr.Length;            var rightMax = 0;            var leftMax = 0;            var max = 0;            for(var i = 0; i < len/2; i++)            {                if (arr[i] > leftMax)                {                    leftMax = arr[i]; //相邻的两个数进行比较,始终留下最大的一个数据滴哎呀;                }                if (arr[len - 1 - i] > rightMax)                {                    rightMax = arr[len - 1 - i];//相邻的两个数进行比较,始终留下最大的一个数据滴哎呀;                }            }            //结束之后,再进行比较;            if (rightMax > leftMax)            {                max = rightMax;            }else            {                max = leftMax;            }            Console.WriteLine("the max value:{0}",max);        }

很快就有了我们的方式五滴呀;

  ps:记录一下,一种不太完善的方式;也就是错误的一种方式,不过思路在异步的走向成熟滴呀;

static void FindMax3()        {            //我们快速排序就是基于这种方式实现滴呀;                        var arr = new int[6] { 40, 320, 10, 24342, 3450, 2 };            var list = new List
(); var len = arr.Length; var left = 0; var right = len - 1; var max = 0; for (var i = 0; i < len ; i++) { if (arr[left+i] > arr[right+i]) { //这种做法逻辑不完善 pass list.Add(arr[left]); } } Console.WriteLine("the max value:{0}", max); }

 最终完整版:

   

 

你会发现,我们的额数组是偶数个的,如果是奇数个数组呢??

 别小看求出数组中的最大一个值,很多排序算法都是从这里衍生出来滴哎呀;

然后,我们将算法,进行一些基本的优化滴哎呀,效果是非常好的滴呀,最大的利用了我们的一次for循环滴呀;

 

 如果是求出数组中第二大的数呢

 如果有事求出数组中前三个最大的数呢,排出一个1 2 3 来呢;

 卧槽,各种联想有木有滴呀

//先来一个笨重的方法

static void GetSecondVlue()        {            var arr = new int[5] { 40, 20, 30, 40, 50 };            //求出第二大的数据,首先你还得找出第一大的数据,谁是第一,有了参照物,你才知道谁是第二大的数据滴啊;            var arrLen = arr.Length;            var max = arr[0];            for (var i = 0; i < arrLen; i++)            {               if (arr[i]>max)                {                    max = arr[i];                }            }            //这样我们就求出了第一大的数据滴呀;            //方式一,第一反应就能想到额;//这个方法之后先tolist之后再进行移除滴呀;            ////然后再比较一次            var list = arr.ToList();            list.Remove(max);            var second = list[0];            for (var j=0;j< list.Count;j++)            {                if (list[j] > second)                {                    second = list[j];                }            }            //方式二,如果遇到max就不参与比较            Console.WriteLine("the seconde value is:{0}",second);        }

 接下来就是我们的第二种方式地啊;

static void GetSecondVlue2()        {            var arr = new int[5] { 40, 20, 30, 40, 50 };            //求出第二大的数据,首先你还得找出第一大的数据,谁是第一,有了参照物,你才知道谁是第二大的数据滴啊;            var arrLen = arr.Length;            var max = arr[0];            var second = 0;            for (var i = 0; i < arrLen; i++)            {                if (arr[i] > max)                {                    max = arr[i];                }            }            //第二种方法就是,再次比较,当我们遇到指定的值(max),我们就不参与比较低啊            for (var j = 0; j < arrLen; j++)            {                //自动过滤掉我们的之前的max地呀;                if (arr[j] != max)     //因为已经参数过了比较,这里我们就不参与比较了地呀                {                    if (arr[j] > second)                    {                        second = arr[j];                      }                }            }                   Console.WriteLine("the seconde value is:{0}", second);        }

 第三种方式

   

static void GetMaxSecond()        {            var arr = new int[5] { 40, 20, 30, 42, 50 };            var arrLen = arr.Length;            for (var j = 0; j < 2; j++)//找出第二大的数据,我找两次,不就得了吗?            {                for (var i = 0; i < arrLen - 1-j; i++)                {                    if (arr[i] > arr[i + 1]) //把前面的一个数据和后面的一个数进行比较                    {                        int temp = arr[i + 1];//中间变量                        arr[i + 1] = arr[i];  //位置交换,大的数据排在前面                        arr[i] = temp; //小的数据排在后面;                    }                }            }            //这样同样能够找出我们的最大的数滴呀;            //当然,如果是有序的结果集合的话,我们当然能够使用我们 折半查找的方式滴呀;            //这个不是就很自然的引出了,我们的额冒泡排序的方式滴呀;            Console.WriteLine("the seconde value is:{0}", arr[arrLen-1-1]);        }

 

如果求两个数组中的最大值呢;

  

static void GetMaxInt()        {            var arr = new int [5] {
40,20,30,40,50 }; var arrLen = arr.Length; int max = arr[0]; //在开始的第一步,我们自然认为:第一个数值最大的值; for (var i = 0; i < arrLen; i++) { if (arr[i] > max) //与第二个数据比较 { max = arr[i]; //这里隐藏着一个copy的操作; //始终保持手中的数 是最大的一个; } else { } } Console.WriteLine("max value={0}",max); } static void GetMax() { //如果求两个数组中的最大值呢; var arr = new int[5] { 40, 20, 30, 40, 50 }; var arr1 = new int[5] { 41, 21, 301, 140, 150 }; //先求出A中的最大 //再求B中的最大值 var arrLen = arr.Length; var arrlen1 = arr1.Length; var max = arr[0]; var max1 = arr1[0]; var finalMax = 0; //求一个数组的最大值 for (var i = 0; i < arrLen; i++) { if (arr[i] > max) { max = arr[i]; } } //求第二个数组的最大值; for(var j=0;j< arrlen1; j++) { if (arr1[j] > max1) { max1 = arr1[j]; } } //然后最终的结果比较 if (max > max1) { finalMax = max; }else { finalMax = max1; } Console.WriteLine("finalMax is :{0}",finalMax);//这个就是我们的最终结果滴啊; //效果还是听不错滴呀; //这种事分两步走的方式滴哎呀; //这种方式,我们就可以充分的利用我们的异常处理;或则叫做并发触发处理方式; //来解决我们的基本方式滴呀; } static void GetMax1() { var arr = new int[5] { 40, 20, 30, 40, 50 }; var arr1 = new int[5] { 41, 21, 301, 140, 150 }; var arrLen = arr.Length; var arrlen1 = arr1.Length; var max = arr[0]; //始终保持最大的变量计算值滴呀; //最终的效果还是挺不错滴哎呀; for (var i = 0; i < arrLen; i++) { if (arr[i] > max) { max = arr[i]; } } //将第一组中的最大数据 与我们的第二组,进行各种比较滴呀; //这种有一点同步滴感觉滴滴呀; for (var j = 0; j < arrlen1; j++) { if (arr1[j] > max) { max = arr1[j]; } } Console.WriteLine("finalMax is :{0}", max);//这个就是我们的最终结果滴啊; } static void GetMax2() { var arr = new int[5] { 40, 20, 30, 40, 50 }; var arr1 = new int[5] { 41, 21, 301, 140, 150 }; var max = 0; //我觉得肯定有方法就行优化滴呀; //进行两次循环比较 //第一个数,与每一数进行比较滴呀; for (var i = 0; i < arr.Length; i++) { for (var j=0;j
arr1[j]) { max = arr[i]; }else { max = arr1[j]; } } } } //双重循环的方式; //效果还是不错滴呀; static void DoubleLoop() { var outer = 10; var inner = 10; for (var i = 0; i

 然后接着就是我们基本的冒泡算法滴呀;

 

static void  BubbleList()        {            Console.WriteLine("从小到大的排列滴哎呀");            var arr = new int[5] { 40, 210, 30, 42, 50 };            var arrLen = arr.Length;            for (var j = 0; j < arrLen; j++)//找出第二大的数据,我找两次,不就得了吗?            {                for (var i = 0; i < arrLen - 1 - j; i++)                {                    if (arr[i] > arr[i + 1]) //把前面的一个数据和后面的一个数进行比较                    {                        int temp = arr[i + 1];//中间变量                        arr[i + 1] = arr[i];  //位置交换,大的数据排在前面                        arr[i] = temp; //小的数据排在后面;                    }                }            }            foreach(var i in arr)            {                Console.WriteLine("the value is:{0}",i);  //最终的排序结果还是出来了滴呀;            }            Console.WriteLine("从大到小的排列滴哎呀");            //上面的结果是小到大的排列滴哎呀;            //那么如果从大到小额拍列呢;            // 数组是引用类型的值滴呀;            var newArr = new int[5] { 40, 20, 310, 42, 50 };            var len = newArr.Length;            for (var i = 0; i < len; i++)            {                for (var j = len- 1; j >i ; j--) //从后面忘前面排滴呀;                {                    if (newArr[j]>newArr[j-1])                    {                        int temp = newArr[j-1];                        newArr[j - 1] = newArr[j];                        newArr[j] = temp;                    }                }            }            foreach (var a in newArr)            {                Console.WriteLine("the value is:{0}", a);  //最终的排序结果还是出来了滴呀;            }        }

  顺便总结中两种for循环的方式;

  

static void FuckingLife()        {            var arr = new int[5] { 10, 20, 30, 40, 50 };            for(var i = 0; i < arr.Length; i++)            {                Console.Write(" {0} ",arr[i]);            }            Console.WriteLine();            for(var j = arr.Length - 1; j >= 0; j--)            {                Console.Write(" {0} ", arr[j]);            }                   }

 

当然还有这样额结果;

static void FuckLife()        {            var outer = 10;            var inner = 10;            Console.WriteLine("这个是【叠加】的效果");            for(var i = 0; i < 10; i++)            {                Console.Write("外部循环");                for(var j = 0; j < inner; j++)                {                    Console.Write("【内部循环】");                }                Console.WriteLine();            }            Console.WriteLine("内部循环【递减】的方式");            for (var i = outer; i >0; i--)            {                Console.Write("外部循环");                for (var j = inner; j >0; j--)                {                    Console.Write("【内部循环】");                }                Console.WriteLine();            }            Console.WriteLine("内部循环递减的方式【另外一种写法;】");            for (var i = 0; i < outer; i++)            {                Console.Write("外部循环");                for (var j = inner - i-1; j >0 ; j--)                {                    Console.Write("【内部循环】");                }                Console.WriteLine();            }            Console.WriteLine("---------------------内部循环递增的方式");            for (var i = 0; i < 10; i++)            {                Console.Write("外部循环");                for (var j = 0; j 

结果:

 

总结:手指好痛~~~,一重循环:两种结果:正序和反序;

        两种循环,2*2 中的组合方式;

        内部可以递减和递增滴哎呀;

算了,手指好痛,不写;

 

转载于:https://www.cnblogs.com/mc67/p/6189484.html

你可能感兴趣的文章
LeetCode 159. Longest Substring with At Most Two Distinct Characters
查看>>
LeetCode Ones and Zeroes
查看>>
基本算法概论
查看>>
jquery动态移除/增加onclick属性详解
查看>>
JavaScript---Promise
查看>>
暖暖的感动
查看>>
Java中的日期和时间
查看>>
Django基于admin的stark组件创建(一)
查看>>
抛弃IIS,利用FastCGI让Asp.net与Nginx在一起
查看>>
C. Tanya and Toys_模拟
查看>>
springboot jar包运行中获取资源文件
查看>>
基于FPGA实现的高速串行交换模块实现方法研究
查看>>
Java Scala获取所有注解的类信息
查看>>
delphi ,安装插件
查看>>
case when then的用法-leetcode交换工资
查看>>
11.28.cookie
查看>>
BeanShell简介
查看>>
python字符串操作
查看>>
不同程序语言的注释和变量要求
查看>>
语言基础(9):static, extern 和 inline
查看>>