Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
abb269
5 / 5 / 2
Регистрация: 29.12.2009
Сообщений: 125
1

Как быстро переставить элементы одномерного массива

27.12.2012, 17:09. Просмотров 531. Ответов 3
Метки нет (Все метки)

Здравствуйте,
Есть потребность быстро переставить элементы одномерного массива.
Пусть есть вектор, значения которого совпадают с индексом
И есть новая последовательность индексов, допустим 2,0,1,3,4
Как переставить элементы массива под эту,произвольную в общем случае, последовательность?
Т.е. в приведенном примере реализовать массив {2,0,1,3,4}.
Такой вариант кажется мне не слишком быстрым и красивым
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
static void Main(string[] args)
        {
            double[] d = { 0, 1, 2, 3, 4 };
            int [] id = { 2, 0, 1, 3, 4 };
 
            double[] tmp = new double[d.Count()];
 
            for (int i = 0; i < d.Count(); i++)
            {
                Console.Write("{0} ", d[i]);
                tmp[i] = d[i];
            }
 
            Console.WriteLine("\r\n---------------");
 
            for (int i = 0; i < d.Count(); i++)
            {
                d[i] = tmp[id[i]];
                Console.Write("{0} ", d[i]);
            }
 
            Console.ReadLine();
        }
Заранее спасибо
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.12.2012, 17:09
Ответы с готовыми решениями:

Переставить в обратном порядке элементы одномерного массива, расположенные до первого минимального элемента массива
1.Переставить в обратном порядке элементы одномерного массива, расположенные до первого...

Переставить в обратном порядке элементы одномерного массива
&quot;Переставить в обратном порядке элементы одномерного массива, расположенные до первого минимального...

Переставить в обратном порядке элементы одномерного массива
Array72. Дан массив A размера N и целые числа K и L (1 ≤ K &lt; L ≤ N). Переставить в обратном порядке...

Переставить в обратном порядке элементы одномерного массива
Помогите решить задачу: &quot;Переставить в обратном порядке элементы одномерного массива,...

Как переставить элементы массива местами?
Как переставить элементы массива местами?Дан массив 1 2 3 4 1 2,а получить 4 2 3 1 1 2? Не судите...

3
kravam
быдлокодер
1711 / 898 / 106
Регистрация: 04.06.2008
Сообщений: 5,588
27.12.2012, 18:11 2
Самый быстрый по-моему способ, это просто-напросто поэлементно скопировать массив id в массив d и всё.


C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication29
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] d = { 0, 1, 2, 3, 4 };
            int[] id = { 2, 0, 1, 3, 4 };
 
            double[] tmp = new double[d.Count()];
 
            for (int i = 0; i < d.Count(); i++)
            {
                d[i] = id[i];
            }
 
            Console.WriteLine("\r\n---------------");
 
            for (int i = 0; i < d.Count(); i++)
            {
                Console.Write("{0} ", d[i]);
            }
 
            Console.ReadLine();
        }
    }
}
и не надо огород городить ни с каким temp; кстати если уж у тебя массив индексов то сделай его int

++++++++++++++++++++++++++++++++++++++++++

Интересные проблемы начнутся, когда a будет НЕ МАССИВОМ индексов. Вот тогда действительно можно о скорости выполнения и подумать и поспорить.
0
abb269
5 / 5 / 2
Регистрация: 29.12.2009
Сообщений: 125
27.12.2012, 19:58  [ТС] 3
Так я как раз про это. В реальности нужно работать как раз с вектором, значения которого не равны индексу.
В общем случае, есть как раз не массив {0,1,2,3,4}, а массив {a0,a1,a2,a3,a4} и его нужно переставить в соответствии с некой последовательностью индексов {3,0,2,1,4}
0
kravam
быдлокодер
1711 / 898 / 106
Регистрация: 04.06.2008
Сообщений: 5,588
27.12.2012, 22:13 4
Цитата Сообщение от abb269 Посмотреть сообщение
Так я как раз про это. В реальности нужно работать как раз с вектором, значения которого не равны индексу.
так бы изначально и поставил условие.

Короче твоё решение решается за один проход. Создаётся вектор tmp, ничем не инициализируется, потом за один проход заполняется нужными значениями и вот тебе искомый вектор

Если тебе нужен именно переделанный вектор d, тогда просто:
d= tmp;
И всё

Если тебе необходимо после этого сделать переменную tmp невидимой я описал этот вариант в коде; воспользуйся фигурными скобками.

вот код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication30
{
    class Program
    {
        static void Main(string[] args)
        {
            double[] d = { 0.5, 1.6, 2.5, 3.4, 4.8 };
            int[] id = { 2, 0, 1, 4, 3 };
 
 
            //Благодаря наличию этих фигурных скобок, после выхода
            //из них, рабочей станет только дна переменная d
            //а tmp как бы исчезнет
            {
                double[] tmp = new double[d.Count()];
 
                for (int i = 0; i < d.Count(); i++)
                {
                    tmp[i] = d[id[i]];
                }
 
                //Всё, нужный тебе массив tmp сформирован
 
                for (int i = 0; i < tmp.Count(); i++)
                {
                    Console.Write("{0} ", tmp[i]);
                }
 
                ////////////////////////////////////////////////////
                Console.WriteLine();
 
                //А вот если надо поправить исходный массив d
                d = tmp;
            }
 
 
            for (int i = 0; i < d.Count(); i++)
            {
                Console.Write("{0} ", d[i]);
            }
 
 
            Console.ReadLine();
        }
    }
}
++++++++++++++++++++++++++++++++++++++++++++++++

но как ты сам понимаешь, вектор d в приведённом примере мнимый, то есть мы скропали нужный нам вектор tmp, а потом скомандовали d= tmp; если тебе нужен НАТУРАЛЬНЫЙ переделаный вектор d, тогда твой способ пойдёт вполне
0
27.12.2012, 22:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.12.2012, 22:13

Как найти элементы одномерного массива, которые не повторяются?
???

Переставить элементы массива
В одномерном целочисленном массиве переставить элементы в обратном порядке, не используя других...

Элементы одномерного массива, большие среднего значения элементов массива, заменить на 0.
1. Элементы одномерного массива, большие среднего значения элементов массива, заменить на 0. 2....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru