Fastest algorithm for circle shift N sized array for M position

后端 未结 24 2973
温柔的废话
温柔的废话 2020-11-28 05:33

What is the fastest algorithm for circle shifting array for M positions?
For example, [3 4 5 2 3 1 4] shift M = 2 positions should be [1 4 3 4 5 2 3

相关标签:
24条回答
  • 2020-11-28 05:42

    circleArray has some errors and is not working in all cases!

    The loop must continue while i1 < i2 NOT i1 < last - 1.

    void Shift(int* _array, int _size, int _moves)
    {
        _moves = _size - _moves;
        int i2 = _moves;
             int i1 = -1;
             while(++i1 < i2)
        {
            int tmp = _array[i2];
            _array[i2] = _array[i1];
            _array[i1] = tmp;
            if(++i2 == _size) i2 = _moves;
        }
    }
    
    0 讨论(0)
  • 2020-11-28 05:46

    Set it up with pointers, and it takes almost no time. Each element points to the next, and the "last" (there is no last; after all, you said it was circular) points to the first. One pointer to the "start" (first element), and maybe a length, and you have your array. Now, to do your shift, you just walk your start pointer along the circle.

    Ask for a good algorithm, and you get sensible ideas. Ask for fastest, and you get weird ideas!

    0 讨论(0)
  • 2020-11-28 05:47

    This should work to shift an arry circularly: Input : { 1, 2, 3, 5, 6, 7, 8 }; Output value present in array after the forloops : {8,7,1,2,3,5,6,8,7}

     class Program
        {
            static void Main(string[] args)
            {
                int[] array = { 1, 2, 3, 5, 6, 7, 8 };
                int index = 2;
                int[] tempArray = new int[array.Length];
                array.CopyTo(tempArray, 0);
    
                for (int i = 0; i < array.Length - index; i++)
                {
                    array[index + i] = tempArray[i];
                }
    
                for (int i = 0; i < index; i++)
                {
                    array[i] = tempArray[array.Length -1 - i];
                }            
            }
        }
    
    0 讨论(0)
  • 2020-11-28 05:47

    Ruby example:

    def move_cyclic2 array, move_cnt
      move_cnt = array.length - move_cnt % array.length 
      if !(move_cnt == 0 || move_cnt == array.length)            
        array.replace( array[move_cnt..-1] + array[0...move_cnt] )  
      end   
    end
    
    0 讨论(0)
  • 2020-11-28 05:48
    def shift(nelements, k):       
        result = []
        length = len(nelements)
        start = (length - k) % length
        for i in range(length):
            result.append(nelements[(start + i) % length])
        return result
    

    This code works well even on negative shift k

    0 讨论(0)
  • 2020-11-28 05:48

    See this if you are interested in a Java implementation:

    Programming Pearls: Circular Left/Right Shift Operation

    0 讨论(0)
提交回复
热议问题