惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

G
Google Developers Blog
人人都是产品经理
人人都是产品经理
腾讯CDC
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
WordPress大学
WordPress大学
S
SegmentFault 最新的问题
小众软件
小众软件
B
Blog
博客园 - 叶小钗
Microsoft Azure Blog
Microsoft Azure Blog
Apple Machine Learning Research
Apple Machine Learning Research
A
About on SuperTechFans
J
Java Code Geeks
Blog — PlanetScale
Blog — PlanetScale
博客园 - 司徒正美
博客园 - 【当耐特】
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Recent Announcements
Recent Announcements
宝玉的分享
宝玉的分享
Martin Fowler
Martin Fowler
Hugging Face - Blog
Hugging Face - Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Last Week in AI
Last Week in AI
V
V2EX

博客园 - 毛尹航

GAMES202课程资源 游戏设计制作配置表原则 Unity中文字和图片混合 UI仔需要了解的坑 遇到大段ifelse不要慌,先分层让条件正交 NGUI文字破碎 一个可以用的Lua的Class函数 写一个可以用的Lua打印Table的函数 关于C#的接口的碎碎念 C#中接口是值类型还是引用类型? Unity3d笔试题大全 FPSCalc——简单FPS观测类 GameObjectPool——Unity中的对象池 MonoSingleton——Unity中的单例模式 用非递归、不用栈的方法,实现原位(in-place)的快速排序 MFC中显示图像的放大、缩小、移动功能 MFC中设置对话框/窗体大小固定 MFC【5】MFC集合类 MFC【6】文件I/O和串行化
一道有序洗牌的笔试题,阿里\UC等都用过 - 毛尹航 - 博客园
毛尹航 · 2016-09-29 · via 博客园 - 毛尹航

题目:给定一个已经降序排好序的正数数组,要求按「最小、最大、次小、次大……」的顺序重新排序。期望的时间复杂度为O(n),空间复杂度为O(1),即不能申请额外的数组。

例如:输入[7,6,5,4,3,2,1],输出[1,7,2,6,3,5,4]。

分析:该题有多种方法可以解答,在这里给出一个不超过应届毕业生知识范围的写法。

private static void ReCardsSortInPlace(int[] array)
        {
            if (array == null) throw new ArgumentNullException();
            if (array.Length < 2) return;
            if (array.Length == 2)
            {
                int temp = array[0];
                array[0] = array[1];
                array[1] = temp;
                return;
            }
             //因为循环不变式的初始条件是N>=3所以,当N<=2时只能靠手调了。
            int swapTemp, swapTemp1, length = array.Length - 1, right = length;
            int k = right;
            int rightCount = right - 1;
            //循环进入条件,N>=3,结束条件,从数组右侧开始,当调整的位置的数量大于N/3时
            while ((2 * (length - right + 1)) <= right)
            {
                //循环初始条件
                k = right;
                swapTemp1 = array[right];
                do
                {
                    k = ReIndex(k, length);
                    swapTemp = array[k];
                    array[k] = swapTemp1;
                    swapTemp1 = swapTemp;
              
                } while (right != k);
                //由于数组是递减的,所以调整过的数组一定会满足以下条件
                while (array[rightCount] > array[ReIndex(rightCount, length)])
                {
                    rightCount--;
                }
                right = rightCount;//将未调整的循环的初始值重新赋予right变量
                rightCount = right - 1;
            }
        }
        private static int ReIndex(int index, int length)
        {
            if (index <= length / 2)
                return (2 * index + 1 > length) ? 2 * index : (2 * index + 1);
            else
                return (2 * (length - index));
        }