时间:2018-7-11来源:本站原创作者:佚名

来自:反骨仔(二五仔)-博客园

链接:      

(2)第1个数为5,所以在scors[5]=0的基础上+1,即scors[5]=1表示有1人得到5分

     

(3)第2个数为3,所以在scors[3]=0的基础上+1,即scors[3]=1表示有1人得到3分

     

(4)第3个数为5,所以在scors[5]=1的基础上+1,即scors[5]=2表示有2人得到5分

 

        ......

(5)依此类推,处理第4和第5个数,最终的结果图如下:

(6)我们发现,scors[0]~scors[10]内对应的值就是0~10分中每个分数所出现的次数。现在,只需将结果打印即可,出现几次就打印机次。

我们暂且称它为“马桶排序”,这个算法就相当于有11个马桶,编号从0~10。每出现一个数,就在对应编号的马桶中放一个旗子。

图:这里有11个马桶

三、思考:现在分别有5个人的名字和分数:小A5、小二3、小三5、小妞2和王大锤8,请按照分数从高到低,输出他们的名字?

假设需要排序的范围0~,则需要nwint[],非常浪费空间,即便只给2个数排序(1,);

如果排序的数是小数也不行,如:3.;

这里使用C#给出简单的算法过程。

staticvoidMain(string[]args){varscors=nwint[]{5,3,5,2,8};varnwScors=nwint[9];for(inti=0;iscors.Lngth;i++){varscor=scors[i];nwScors[scor]++;}for(inti=nwScors.Lngth-1;i=0;i--){varnum=nwScors[i];for(intj=1;j=num;j++){Consol.Writ($"{i}");}}Consol.WritLin();Consol.Rad();}}冒泡排序(面试都要问的算法)

一、基本思想:每次比较相邻的两个元素,按需调整顺序

二、题目:要求将这5个数进行从大到小排序

三、思路:

(1)先比较第1位和第2位的大小,,因为希望越小越靠后,所以要调整两者顺序,交换后的结果:

(2)现在比较第2位和第3位的大小,,所以需要交换位置,交换后的结果为:

(3)接着比较第3位和第4位的大小,,交换后的结果为:

(4)最后比较第4位和第5位的大小,,交换后的结果为:

(5)经过4次后我们发现5个数中最小的一个数已经就位,每将一个数归位我们称其为“一趟”;

(6)现在我们开始第二趟,目标将第2小的数归位,根据之前逻辑,还是从第1个数和第2个数开始比较上:

--①----②----③--

在第一趟比较就知道第5位是最小的,所以第4位不用和第5位比较,这一趟只需比较3次

(7)第3趟:----(比较2次)

(8)第4趟:--,有4个数已经就位,那么最后一个数无须比较,它就是最大的

如果有n个数进行排序,只需将n-1个数归位,即要进行n-1趟操作,而每一趟开始都从第1位进行相邻的两个数进行比较,将小的那个数放在后面,已经归位的就不用进行比较。

冒泡算法的核心部分是双重嵌套循环,可以看出时间复杂度是O(N2),这是一个非常高的时间复杂度。

这里使用C#给出简单的算法过程。

staticvoidMain(string[]args){varnums=nwint[]{12,35,99,18,76};Output(nums);for(intj=0;jnums.Lngth-1;j++){for(inti=0;inums.Lngth-1;i++){if(nums[i]nums[i+1]){vartmp=nums[i];nums[i]=nums[i+1];nums[i+1]=tmp;}}Output(nums);}Consol.Rad();}///summary///控制台输出////summary///paramnam="nums"/paramstaticvoidOutput(int[]nums){forach(varnuminnums){Consol.Writ($"{num}");}Consol.WritLin();}快速排序(见证亚当和夏娃的爱情之旅)

一、场景:对这10个数进行排序

二、思路:

先找一个基准数(一个用来参照的数),为了方便,我们选最左边的6,希望将6的放到6的右边,6的放到6左边。如:

先假设需要将6挪到的位置为k,k左边的数6,右边的数6

(1)我们先从初始数列“”的两端开始“探测”,先从右边往左找一个6的数,再从左往右找一个6的数,然后交换。我们用变量i和变量j指向序列的最左边和最右边。刚开始时最左边i=0指向6,最右边j=9指向8

图:亚当i和夏娃j

(2)现在设置的基准数是最左边的数,所以序列先右往左移动(j--),当找到一个6的数(5)就停下来。接着序列从左往右移动(i++),直到找到一个6的数又停下来(7);

(3)两者交换,结果:;

(4)j的位置继续向左移动(友情提示:每次都必须先从j的位置出发),发现4满足要求,接着i++发现9满足要求,交换后的结果:;

(5)目前j指向的值为9,i指向的值为4,j--发现3符合要求,接着i++发现i=j,说明这一轮移动结束啦。现在将基准数6和3进行交换,结果:;现在6左边的数都是6的,而右边的数都是6的,但游戏还没结束

     

图:亚当和夏娃终于产生了交集

(6)我们将6左边的数拿出来先:,这次以3为基准数进行调整,使得3左边的数3,右边的数3,根据之前的模拟,这次的结果:

(7)再将21抠出来重新整理,得到的结果:12

(8)剩下右边的序列:也是这样来搞,最终的结果:(具体看下图)

快速排序的每一轮处理其实就是将这一轮的基准数归位,当所有的基准数归位,排序就结束啦

●本文编号49,以后想阅读这篇文章直接输入49即可。

●输入m可以获取到文章目录

推荐《15个技术类公众







































白颠疯是怎么引起的
北京治白癜风最好的专科医院

转载请注明原文网址:http://www.helimiaopu.com/cxys/cxys/6425.html

------分隔线----------------------------