君不知

冒泡排序之面试官的常问题

电脑版发表于:2018/12/19 19:09

本人面试过的公司有3家公司的面试官都问了同一个问题

面试官:会写排序吗?

我:会啊!

面试官:来一个冒泡排序吧。(随手给了你一张纸,一支笔)


那么问题来了:  如何让面试官对你的冒泡排序感兴趣?


首先:冒泡排序不能单一(只写一种)


其次 :不能直接写出高难度的排序(太浪费自己的时间了)


最后:在你写的最简单的排序中,向面试官变换一下你的排序方式


本人没事时总结出的几种(不是全部)排序方式


一.最简单的冒牌直排(直接排序)

int[] num = { 1, 4, 3, 10, 5, 8, 7, 6 };  //首先你得有一个可以排序的数组
            for (int i = 0; i < num.Length - 1; i++)  //循环所有的元素
            {

                for (int j = 0; j < num.Length - 1; j++)
                {

                    if (num[j] > num[j + 1])    //开始比较元素大小      这里判断是看你从小到大  还是从大到小
                    {
                        int temp = num[j + 1];   //将小的一个暂存起来
                        num[j + 1] = num[j];
                        num[j] = temp;            //把小的赋值给前一个元素
                    }
                }
            }

这是最基本的排序  但是  这是最基础的实现排序  下面改造一下

int[] num = { 1, 4, 3, 10, 5, 8, 7, 6 };  //你还是得有一个可以排序的数组
            for (int i = 0; i < num.Length - 1; i++)  //还是一样循环所有的元素
            {

                for (int j = 0; j < num.Length - 1 - i; j++)    //注意此处的 -i  这是过滤调已经排过的元素,可以提高循环效率
                {

                    if (num[j] > num[j + 1])   
                    {
                        int temp = num[j + 1];
                        num[j + 1] = num[j];
                        num[j] = temp;
                    }
                }
            }

这是最基本的for 循环排序了


二.来一个while的排

    看代码->

            int[] num = { 1, 4, 3, 10, 5, 8, 7, 6 }; //还是同一个数组
            int i = 0;
            int j = 0;
            while (i < num.Length - 1)
            {
                while (j < num.Length - 1)
                {
                    if (num[j] > num[j + 1])
                    {
                        int temp = num[j + 1];
                        num[j + 1] = num[j];
                        num[j] = temp;

                    }
                    j++;
                }
                i++;
            }

这是通过最简单的for循环来的while循环排序 原理是一个样子的,没有技术含量

那么问题又来了:现在这个排序一样是没有过率掉已经排过的元素,怎么去过滤?


我提供其中一种(剩下的可以自己脑补一下)

            int[] num = { 1, 4, 3, 10, 5, 8, 7, 6 };  
            int i = 0;
            int j = 0;
            bool flag = true;                        //添加一个开关
            while (i < num.Length - 1 && flag)
            {
                flag = false;
                while (j < num.Length - 1)
                {
                    flag = true;
                    if (num[j] > num[j + 1])
                    {
                        int temp = num[j + 1];
                        num[j + 1] = num[j];
                        num[j] = temp;

                    }
                    j++;
                }
                i++;
            }

这里使用的是for 循环   while循环排序  

那么这点排序是微乎其微的,所有就有了变换形的排序


三.先来一个for循环的逆向排序玩玩

    直接上代码->一个反向的从大到小的排序

 int[] num = { 1, 4, 3, 10, 5, 8, 7, 6 };

            for (int i = num.Length - 1; i > 0; i--)
            {

                for (int j = 0; j < i; j++)
                {
                    if (num[j] < num[j + 1])
                    {
                        int temp = num[j];
                        num[j] = num[j+1];
                        num[j+1] = temp;
                    }
                }

            }

其余的自己脑补


四.再来一个for和 while 的嵌套

            int[] num = { 1, 4, 3, 10, 5, 8, 7, 6 };
            int i = 0;
            bool falg = true;
            while (i < num.Length - 1 && falg)
            {
                falg = false;
                i++;
                for (int j = 0; j < num.Length - i; j++)
                {
                    falg = true;
                    if (num[j] > num[j + 1])
                    {
                        int temp = num[j + 1];
                        num[j + 1] = num[j];
                        num[j] = temp;

                    }
                }
            }

其余的嵌套自己脑补(还有很多的方式)


关于TNBLOG
TNBLOG,技术分享。技术交流:群号677373950
ICP备案 :渝ICP备18016597号-1
App store Android
精彩评论
{{item.replyName}}
{{item.content}}
{{item.time}}
{{subpj.replyName}}
@{{subpj.beReplyName}}{{subpj.content}}
{{subpj.time}}
猜你喜欢