Как найти сортировку отрицательных элементов массива

Вообщем, я смог все-таки сам решить эту задачу.

//first version of 9.1 - using just a bubble sort 

#include <stdio.h> 
#include <conio.h> 

#define N 10 

void negsort(int *array, int size); // a bubble sort for negatives 
void swap(int *element1, int *element2); // swap elements(for sorting) 
void enter(int *array, int size); // entering array 
void arintf(int *array, int size); // printing array 
int setsize(int size); // seting the size 

int main(){ 

int a[N] /*= {-98, 65, -87, 35, -76, -65, -45, 56, 76, -34}*/, n = N; 

clrscr(); 

n = setsize(n); 

enter(a, n); 

negsort(a, n); 

arintf(a, n); 

getch(); 
return 0; 
} 

void enter(int *array, int size){ 
int *el_scan; 

printf("Enter elements of your array:n"); 

for(el_scan = array; el_scan < &array[size]; el_scan++){ 
printf("a[%d] = ", (el_scan - array) + 1); 
scanf("%d", el_scan); 
} 
} 

void arintf(int *array, int size){ 
int *el_print; 

printf("Modified array:n"); 

for(el_print = array; el_print < &array[size]; el_print++){ 
printf("%d ", *el_print); 
} 
} 

void swapbts(int *element1, int *element2){ 

int exchanger = 0; 

if(*element1 < *element2 /*&& *element1 < 0*/){ 
exchanger = *element1; 
*element1 = *element2; 
*element2 = exchanger; 
} 
} 

void negsort(int *array, int size){ 

int *foward, *back, dummy = 0, *negative, *secneg; 

for(back = &array[size]; back >= array; back--){ 
for(foward = array; foward < back; foward++){ 
if (*foward < 0) negative = foward; 

else if(*foward > 0){ 
dummy = 0; 
dummy++; 
} 

if(*(foward + dummy) < 0) secneg = foward + dummy; 

swapbts(negative, secneg); 
} 
} 

// return array; 
} 

int setsize(int size){ 

printf("Enter the size of array(max = 10): "); 
scanf("%d", &size); 

if(size > N){ 
printf("You entered size that bigger than max. Setting to max.n"); 
size = N; 
} 
else if(size <= 1){ 
printf("We cannot sort a array with only one element. Setting to 2.n"); 
size = 2; 
} 
return(size); 
}

Модификация пузырьковой сортировки:

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int main() {
srand(time(0));
cout << “random array:”;
int a[20];
for (int c = 0; c < sizeof(a)/sizeof(int); ++c) {
cout << ‘ ‘ << (a[c] = rand() % 21 – 10);
}
bool t = true;
while (t) {
t = false;
for (int c1 = 0; c1 < sizeof(a)/sizeof(int) – 1; ++c1)
if (a[c1] < 0)
for (int c2 = c1 + 1; c2 < sizeof(a)/sizeof(int); ++c2)
if (a[c1] > a[c2]) {
int tmp = a[c1];
a[c1] = a[c2];
a[c2] = tmp;
t = true;
}
}
cout << endl << “sorted array:”;
for (int c = 0; c < sizeof(a)/sizeof(int); ++c) {
cout << ‘ ‘ << a[c];
}
}

Improve Article

Save Article

Like Article

  • Read
  • Discuss
  • Improve Article

    Save Article

    Like Article

    Given an array arr[] of N integers, the task is to sort the array without changing the position of negative numbers (if any) i.e. the negative numbers need not be sorted.

    Examples: 

    Input: arr[] = {2, -6, -3, 8, 4, 1} 
    Output: 1 -6 -3 2 4 8
    Input: arr[] = {-2, -6, -3, -8, 4, 1} 
    Output: -2 -6 -3 -8 1 4 

    Approach: Store all the non-negative elements of the array in another vector and sort this vector. Now, replace all the non-negative values in the original array with these sorted values.

    Below is the implementation of the above approach:  

    C++

    #include <bits/stdc++.h>

    using namespace std;

    void sortArray(int a[], int n)

    {

        vector<int> ans;

        for (int i = 0; i < n; i++) {

            if (a[i] >= 0)

                ans.push_back(a[i]);

        }

        sort(ans.begin(), ans.end());

        int j = 0;

        for (int i = 0; i < n; i++) {

            if (a[i] >= 0) {

                a[i] = ans[j];

                j++;

            }

        }

        for (int i = 0; i < n; i++)

            cout << a[i] << " ";

    }

    int main()

    {

        int arr[] = { 2, -6, -3, 8, 4, 1 };

        int n = sizeof(arr) / sizeof(arr[0]);

        sortArray(arr, n);

        return 0;

    }

    Java

    import java.util.*;

    class GFG

    {

    static void sortArray(int a[], int n)

    {

        Vector<Integer> ans = new Vector<>();

        for (int i = 0; i < n; i++)

        {

            if (a[i] >= 0)

                ans.add(a[i]);

        }

        Collections.sort(ans);

        int j = 0;

        for (int i = 0; i < n; i++)

        {

            if (a[i] >= 0)

            {

                a[i] = ans.get(j);

                j++;

            }

        }

        for (int i = 0; i < n; i++)

            System.out.print(a[i] + " ");

    }

    public static void main(String[] args)

    {

        int arr[] = { 2, -6, -3, 8, 4, 1 };

        int n = arr.length;

        sortArray(arr, n);

    }

    }

    Python3

    def sortArray(a, n):

        ans=[]

        for i in range(n):

            if (a[i] >= 0):

                ans.append(a[i])

        ans = sorted(ans)

        j = 0

        for i in range(n):

            if (a[i] >= 0):

                a[i] = ans[j]

                j += 1

        for i in range(n):

            print(a[i],end = " ")

    arr = [2, -6, -3, 8, 4, 1]

    n = len(arr)

    sortArray(arr, n)

    C#

    using System.Collections.Generic;

    using System;

    class GFG

    {

    static void sortArray(int []a, int n)

    {

        List<int> ans = new List<int>();

        for (int i = 0; i < n; i++)

        {

            if (a[i] >= 0)

                ans.Add(a[i]);

        }

        ans.Sort();

        int j = 0;

        for (int i = 0; i < n; i++)

        {

            if (a[i] >= 0)

            {

                a[i] = ans[j];

                j++;

            }

        }

        for (int i = 0; i < n; i++)

            Console.Write(a[i] + " ");

    }

    public static void Main(String[] args)

    {

        int []arr = { 2, -6, -3, 8, 4, 1 };

        int n = arr.Length;

        sortArray(arr, n);

    }

    }

    Javascript

    <script>

    function sortArray(a, n)

    {

        var ans = [];

        for (var i = 0; i < n; i++) {

            if (a[i] >= 0)

                ans.push(a[i]);

        }

        ans.sort((a,b)=> a-b);

        var j = 0;

        for (var i = 0; i < n; i++) {

            if (a[i] >= 0) {

                a[i] = ans[j];

                j++;

            }

        }

        for (var i = 0; i < n; i++)

            document.write( a[i] + " ");

    }

    var arr = [2, -6, -3, 8, 4, 1];

    var n = arr.length;

    sortArray(arr, n);

    </script>

    Time Complexity: O(n * log n) // sorting an array takes n logn time and traversing the array takes linear time, hence the overall complexity turns out to be O(n * log n)

    Auxiliary Space: O(n) // since an extra array is used so the solution takes space equal to the length of the array

    Last Updated :
    08 Aug, 2022

    Like Article

    Save Article

    Сортировка ведра для сортировки массива с отрицательными числами

    31.12.2019Сортировка

    Мы обсудили сортировку ведер в главном посте по сортировке ведер .
    Сортировка по группам в основном полезна, когда входные данные равномерно распределены по диапазону. Например, рассмотрим проблему сортировки большого набора чисел с плавающей запятой, которые находятся в диапазоне от 0,0 до 1,0 и равномерно распределены по всему диапазону. В приведенном выше посте мы обсудили сортировку по группам для сортировки чисел, которые больше нуля.

    Как изменить Bucket Sort для сортировки как положительных, так и отрицательных чисел?

    Пример:

    Input : arr[] = { -0.897, 0.565, 0.656, -0.1234, 0, 0.3434 } 
    Output : -0.897 -0.1234  0 0.3434 0.565 0.656 
    

    Здесь мы рассматриваем число в диапазоне от -1,0 до 1,0 (число с плавающей запятой)
    Алгоритм:

    sortMixed(arr[], n)
    1) Split array into two parts 
       create two Empty vector Neg[], Pos[] 
       (for negative and positive element respectively)
       Store all negative element in Neg[] by converting
       into positive (Neg[i] = -1 * Arr[i] )
       Store all +ve in pos[]  (pos[i] =  Arr[i])
    2) Call function bucketSortPositive(Pos, pos.size())
       Call function bucketSortPositive(Neg, Neg.size())
    
    bucketSortPositive(arr[], n)
    3) Create n empty buckets (Or lists).
    4) Do following for every array element arr[i]. 
           a) Insert arr[i] into bucket[n*array[i]]
    5) Sort individual buckets using insertion sort.
    6) Concatenate all sorted buckets. 
    

    Ниже приведена реализация вышеуказанной идеи на языке c ++ (для числа с плавающей запятой).

    #include <bits/stdc++.h>

    using namespace std;

    void bucketSort(vector<float> &arr, int n)

    {

        vector<float> b[n];

        for (int i=0; i<n; i++)

        {

            int bi = n*arr[i];

            b[bi].push_back(arr[i]);

        }

        for (int i=0; i<n; i++)

            sort(b[i].begin(), b[i].end());

        int index = 0;

        arr.clear();

        for (int i = 0; i < n; i++)

            for (int j = 0; j < b[i].size(); j++)

                arr.push_back(b[i][j]);

    }

    void sortMixed(float arr[], int n)

    {

        vector<float>Neg ;

        vector<float>Pos;

        for (int i=0; i<n; i++)

        {

            if (arr[i] < 0)

                Neg.push_back (-1 * arr[i]) ;

            else

                Pos.push_back (arr[i]) ;

        }

        bucketSort(Neg, (int)Neg.size());

        bucketSort(Pos, (int)Pos.size());

        for (int i=0; i < Neg.size(); i++)

            arr[i] = -1 * Neg[ Neg.size() -1 - i];

        for(int j=Neg.size(); j < n; j++)

            arr[j] = Pos[j - Neg.size()];

    }

    int main()

    {

        float arr[] = {-0.897, 0.565, 0.656,

                       -0.1234, 0, 0.3434};

        int n = sizeof(arr)/sizeof(arr[0]);

        sortMixed(arr, n);

        cout << "Sorted array is n";

        for (int i=0; i<n; i++)

            cout << arr[i] << " ";

        return 0;

    }

    Выход:

    Sorted array is 
    -0.897  -0.1234 0 0.3434 0.565 0.656 
    

    Эта статья предоставлена Nishant Singh . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

    Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

    Рекомендуемые посты:

    • Сортировать элементы по частоте | Комплект 1
    • k самых больших (или самых маленьких) элементов в массиве | добавлен метод Min Heap
    • Граф Инверсии в массиве | Набор 1 (с использованием сортировки слиянием)
    • Разделите 0 и 1 в массиве
    • Сортировка слиянием для связанных списков
    • Сортировать массив 0, 1 и 2
    • Найти минимальный размер несортированного подмассива, сортировка которого позволяет отсортировать весь массив
    • Найти, является ли массив подмножеством другого массива | Добавлен метод 3
    • std :: sort () в C ++ STL
    • Сортировать почти отсортированный (или отсортированный по K) массив
    • Сортировка номеров, хранящихся на разных машинах
    • Итеративная быстрая сортировка
    • Сортировать связанный список 0, 1 и 2
    • Подсчет Сортировка
    • Сортировать элементы по частоте | Набор 2

    Сортировка ведра для сортировки массива с отрицательными числами

    0.00 (0%) 0 votes

    На занятии объясняется, как работать с одномерными массивами в Паскале, как использовать генератор случайных чисел — функцию random в Паскале. Рассматривается пример того, как вывести числа Фибоначчи

    Материалы сайта labs-org.ru направлены на практическое освоение языка программирования Pascal. Краткие теоретические сведения не претендуют на полное освещение материала по теме; необходимую информацию можно найти в сети Интернет в большом количестве. В наши же задачи входит предоставление возможности получения практических навыков программирования на Паскале. Решенные наглядные примеры и задания изложены по мере увеличения их сложности, что позволит с легкостью изучить материал с нуля.

    Содержание:

    • Одномерные массивы в Паскале
      • Объявление массива
      • Инициализация массива
      • Вывод элементов массива
      • Динамические массивы (pascalAbc.Net)
      • Функция Random в Pascal
      • Числа Фибоначчи в Паскале
      • Максимальный (минимальный) элемент массива
      • Поиск в массиве
      • Циклический сдвиг
      • Перестановка элементов в массиве
      • Выбор элементов и сохранение в другой массив
      • Сортировка элементов массива

    Одномерные массивы в Паскале

    Объявление массива

    Массивы в Паскале используются двух типов: одномерные и двумерные.
    Определение одномерного массива в Паскале звучит так: одномерный массив — это определенное количество элементов, относящихся к одному и тому же типу данных, которые имеют одно имя, и каждый элемент имеет свой индекс — порядковый номер.
    Описание массива в Паскале (объявление) и обращение к его элементам происходит следующим образом:

    Описание массива в Паскале

    Объявление массива

    var dlina: array [1..3] of integer;
    begin
    dlina[1]:=500; 
    dlina[2]:=400; 
    dlina[3]:=150;
    ...
  • dlina — идентификатор (имя) массива;
  • для объявления используется служебное слово Array (в переводе с англ. «массив» или «набор»);
  • [1..3] — в квадратных скобках ставится номер (индекс) первого элемента, затем две точки и индекс последнего элемента массива, т.е. по сути, указывается количество элементов; количество элементов массива называется размерностью массива
  • of integer (с англ. «из целых чисел») — указывает, к какому типу относится массив, of здесь — служебное слово.
  • Объявить размер можно через константу:

    размер массива через константу

    Инициализация массива

    Кроме того, массив может быть сам константным, т.е. все его элементы в программе заранее определены. Описание такого массива выглядит следующим образом:

    const a:array[1..4] of integer = (1, 3, 2, 5);

    Заполнение последовательными числами:
    заполнение массива

    Результат:
    A[1] = 8, A[2] = 9, A[3] = 10, ..., A[N] = A[N-1] + 1
    

    Ввод с клавиатуры:

    Пример: Рассмотрим, как происходит ввод массива в Паскале:

    writeln ('введите кол-во элементов: ');
    readln(n); {если кол-во заранее не известно, - запрашиваем его}
    for i := 1 to n do begin
       write('a[', i, ']=');
       read(a[i]);
       ...
    end;
    ...

    ввод массива с клавиатуры
    ✍ Пример результата:

    введите кол-во элементов: 
    3
    a[1]=5
    a[2]=7
    a[3]=4
    

    Вывод элементов массива

    Пример: Рассмотрим, как вывести массив в Паскале:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    var
      a: array[1..5] of integer; {массив из пяти элементов}
      i: integer;
    begin
    a[1]:=2;
    a[2]:=4;
    a[3]:=8;
    a[4]:=6;
    a[5]:=3;
    writeln('Массив A:');
    for i := 1 to 5 do
        write(a[i]:2); {вывод элементов массива}
    end.

    ✍ Пример результата:

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

    Задача Array 0. Необходимо задать вещественный массив размерностью 6 (т.е. из шести элементов); заполнить массив вводимыми значениями и вывести элементы на экран. Использовать два цикла: первый — для ввода элементов, второй — для вывода.

    Пример результата:

    введите элемент массива: 3.0
    введите элемент массива: 0.8
    введите элемент массива: 0.56
    введите элемент массива: 4.3
    введите элемент массива: 23.8
    введите элемент массива: 0.7
    Массив =  3, 0.8, 0.56, 4.3, 23.8, 0.7

    [Название файла: taskArray0.pas]

    В данном примере работы с одномерным массивом есть явное неудобство: присваивание значений элементам.

    Обработка массивов в Паскале, так же как и заполнение массива, происходит обычно с использованием цикла for.

    Динамические массивы (pascalAbc.Net)

    Основным недостатком статических массивов является то, что их размер нельзя задать с учетом текущих обрабатываемых данных. Приходится описывать массивы с максимально возможным значением количества элементов, выделяя для них столько памяти, сколько может потребоваться для хранения самой большого из возможных наборов исходных данных.

  • Основной особенностью динамических массивов является возможность выделения для них памяти на любом этапе выполнения программы.
  • Имеется возможность корректировки размера динамического массива как в сторону его уменьшения, так и в сторону увеличения.
  • Объявление:

    var a: array of integer;
    var n:=readInteger;
    a:=new integer[n]; // инициализация, выделение памяти для элементов массива

    или:

    var a: array of integer;
    var n:=readInteger;
    SetLength(a,n); // устанавливаем размер

    Аналогичным образом массивы могут описываться в качестве параметров подпрограмм, например:

    procedure p(a: array of integer);

    Созданные элементы сразу получают начальное значение, равное нулевому значению соответствующего типа: для чисел это целый или вещественный нуль, для символов — символ с кодом 0, для строк и других ссылочных типов данных — нулевая ссылка nil

    Объявление и инициализация массива:

    Пример:

    begin
      var a: array of integer;
      a := new integer[3];
      a[0] := 5;
      a[1] := 2;
      a[2] := 3;
    end.

    или в одну строку:

    begin
      var a: array of integer;
      a := new integer[3](5,2,3);
      print(a)
    end.

    или короткая запись:

    var a:=Arr(1,2,3);// по правой части - integer

    Элементы динамического массива всегда индексируются от 0.

    Ввод элементов:

    Пример:

    var a:=ReadArrInteger(5); // ввод пяти целых
    var a:=ReadArrReal(5); // ввод пяти вещественных

    Функции генерации массивов:

    1. ArrFill :

    var a := ArrFill(10, 1); // массив из 10 целых чисел, равных 1

    2. ArrGen :

    var a := ArrGen(ReadInteger, 1, e -> e + 2); // массив, состоящий из n первых положительных нечетных чисел
    a.Print;

    Проход по элементам массива:

    Пример:

    for var i:=0 to a.Length-1 do
      a[i] += 1;

    или:

    for var i := 0 to a.High do
      a[i] += 1;

    Проход по элементам (только для чтения):
    Пример:

    foreach var x in a do
      Print(x)
  • Размер динамического массива (т. е. количество его элементов) можно определить с помощью его свойства Length
  • Для динамического массива определены еще два свойства: Low и High, определяющие соответственно нижнюю и верхнюю границу диапазона изменения индекса. Свойство a.Low всегда возвращает 0, а свойство a.High определяется как a.High = a.Length – 1
  • Простой вывод элементов:

    Writeln(a); // пример вывода: [1,5,3,13,20]

    или метод массива Print:

    a.Print; // пример вывода: 1 5 3 13 20
    a.PrintLines; // каждый элемент с новой строки

    Функция Random в Pascal

    Для того чтобы постоянно не запрашивать значения элементов массива используется генератор случайных чисел в Паскаль, который реализуется функцией Random. На самом деле генерируются псевдослучайные числа, но суть не в этом.

    Для генерации чисел от 0 до n (не включая само значение n, целые числа в интервале [0,N)) используется запись random (n).
    Перед использованием функции необходимо инициализировать датчик случайных чисел с помощью процедуры randomize.

    Диапазон в Паскале тех самых случайных чисел от a до b задается формулой:

    Пример: Заполнение массива случайными числами в Pascal:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    var f: array[1..10] of integer;
        i:integer;
    begin
    randomize;
    for i:=1 to 10 do
      begin
       f[i]:=random(10); { интервал [0,9] }   
       write(f[i],' ');
      end;
    end.

    ✍ Пример результата: 

    Для вещественных чисел в интервале [0,1):

    var x: real;
    ...
    x := random(0.0,1.0);;         { интервал [0,1), т.е. единица не включена }

    PascalABC.NET:

  • Сгенерированный случайным образом кортеж из двух (Random2), либо из трех (Random3) элементов:
  • var (a, b, c) := Random3(10.0, 20.0); // диапазон [10, 20)
    write(a:0:2,' ',b:0:2,' ', c:0:2) // 14.73 18.63 19.72
  • Массив из 10 сгенерированных случайным образом целых чисел в диапазоне [0;99]:
  • Пример:

    var a:=arrRandomInteger(10);

    или с дополнительными параметрами (диапазон [5;15]):

    var a:=arrRandomInteger(10,5,15);

    Задача Array 1. Необходимо задать массив размерностью 5, заполнить массив случайными числами в интервале [-1,1] и вывести элементы на экран: определить три позиции для вывода каждого элемента, с двумя знаками после запятой.

    Пример результата:

    Массив =  0.22 0.00 -0.69 -0.35 -0.11 

    [Название файла: taskArray1.pas]

    Числа Фибоначчи в Паскале

    Наиболее распространенным примером работы с массивом является вывод ряда чисел Фибоначчи в Паскаль. Рассмотрим его.

    Пример: Ряд чисел Фибоначчи: 1 1 2 3 5 8 13…

    f[0]:=1;   
    f[1]:=1; 
    f[2]:=2;

    или

    f[2]:=f[0]+f[1];
    f[3]:=f[1]+f[2];

    или

    Получили формулу элементов ряда.

    Пример: Вычислить и распечатать первые 20 чисел Фибоначчи.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    var i:integer;
    f:array[0..19]of integer;
    begin
    f[0]:=1;
    f[1]:=1;
    for i:=2 to 19 do
    begin
      f[i]:=f[i-1]+f[i-2];
      writeln(f[i])
    end;
    end.

    На данном примере, становится понятен принцип работы с числовыми рядами. Обычно, для вывода числового ряда находится формула определения каждого элемента данного ряда. Так, в случае с числами Фибоначчи, эта формула-правило выглядит как f[i]:=f[i-1]+f[i-2]. Поэтому ее необходимо использовать в цикле for при формировании элементов массива.

    Задача Array 2. Дан ряд из 10 произвольных чисел: a[1], a[2], ... , a[10] (использовать функцию random()). Подсчитать и напечатать суммы троек стоящих рядом чисел: a[1]+a[2]+a[3], a[2]+a[3]+a[4], a[3]+a[4]+a[5], …… , a[8]+a[9]+a[10]

    Пример результата:

    Массив =  2 0 4 29 3 11 26 11 9 4 
    mas[1] + mas[2] + mas[3] = 6
    mas[2] + mas[3] + mas[4] = 33
    mas[3] + mas[4] + mas[5] = 36
    mas[4] + mas[5] + mas[6] = 43
    mas[5] + mas[6] + mas[7] = 40
    mas[6] + mas[7] + mas[8] = 48
    mas[7] + mas[8] + mas[9] = 46
    mas[8] + mas[9] + mas[10] = 24

    [Название файла: taskArray2.pas]

    Задача Array 3. Написать программу решения задачи о печати ряда чисел 2 4 8 16 32 ... 512; для заполнения массива использовать цикл Repeat
    [Название файла: taskArray3.pas]

    Максимальный (минимальный) элемент массива

    Псевдокод:
    Максимальный (минимальный) элемент массива

    Поиск максимального элемента по его индексу:
    максимальный элемент по номеру


    PascalABC.NET:

    Минимальный элемент и его индекс:

    Решение 1:

      // …
      var (min, minind) := (a[0], 0);  
      for var i:=1 to a.Length-1 do
        if a[i]<min then
          (min, minind) := (a[i], i);  Result := (min, minind);

    Решение 2:

      // …
      var (min, minind) := (real.MaxValue, 0);  
      for var i:=0 to a.Length-1 do
        if a[i]<min then
          (min, minind) := (a[i], i);  Result := (min, minind);

    Решение 3:

    begin
      var a := new integer[5];
      a := arrRandomInteger(5); // [86,37,41,45,76] 
      print(a.Min,a.IndexMin); // 37  1
    end.

    Задача Array_min: Найдите минимальный элемент массива. Выведите элемент и его индекс.

    Пример результата:

    9 5 4 22 23 7 3 16 16 8 
    Минимальный элемент массива A[7]=3
    

    [Название файла: taskArray_min.pas]

    Задача Array 4. Дан массив из 10 целочисленных элементов. Найти количество отрицательных и вывести количество на экран.

    Пример результата:

    3 4 6 -1 6 -2 1 5 0 1 
    Количество отрицательных элементов: 2
    

    [Название файла: taskArray4.pas]

    Задача Array 5. Найти минимальное и максимальное из n введенных чисел (массива). Определить расстояние между этими элементами.

    3  2  6  1  3  4  7  2  >>>  min=1, max=7, distance=3
    

    [Название файла: taskArray5.pas]

    Задача Array 6. Дан целочисленный массив размера N. Вывести все содержащиеся в данном массиве четные числа в порядке убывания их индексов, а также их количество K.

    N=4
    mas: 8 9 2 5
    >>> 2 8 количество= 2
    

    [Название файла: taskArray6.pas]

    Задача Array 7. Ввести с клавиатуры массив из 5 элементов, найти в нем два максимальных элемента и их номера.

    Пример:

    Исходный массив:
    4   -5   10  -10  5
    максимальные A[3]=10, A[5]=5
    

    [Название файла: taskArray7.pas]

    Поиск в массиве

    Рассмотрим сложный пример работы с одномерными массивами:

    Пример: Дан массив из 10 чисел. Определить, есть ли в массиве число, введенное пользователем. Если есть – выводить «найдено», если нет – «не найдено».
    Сложность задания заключается в том, что выводить слова «найдено» или «не найдено» необходимо один раз.

    Для решения поставленной задачи понадобится оператор break — выход из цикла.
    Решение Вариант 1. Цикл for:


    PascalABC.NET:

    Cтандартные методы a.IndexOf(x) и a.LastIndexOf(x):

    begin
      var a := new integer[10];
      a := arrRandomInteger(5,0,5); //[1,3,5,4,5] 
      print(a.IndexOf(3)) // 1
    end.

    или метод a.Contains(x) наравне с x in a:

    begin
      var a := new integer[10];
      a := arrRandomInteger(5,0,5); //[1,3,5,4,5] 
      print(a.Contains(3)); // True
      print(3 in a)// True
    end.

    Рассмотрим эффективное решение:

    Задача: найти в массиве элемент, равный X, или установить, что его нет.

    Алгоритм:

    • начать с 1-го элемента (i:=1);
    • если очередной элемент (A[i]) равен X, то закончить поиск иначе перейти к следующему элементу.

    решение на Паскале Вариант 2. Цикл While:

    Поиск элемента в массиве

    Поиск элемента в массиве

    Предлагаем посмотреть подробный видео разбор поиска элемента в массиве (эффективный алгоритм):

    Задача Array 8. Заполнить массив из 10 элементов случайными числами в интервале [0..4] и вывести номера всех элементов, равных X.

    Пример:

    	 Исходный массив:
    	 4  0  1  2  0  1  3  4  1  0
    	 Что ищем? 0
    	 A[2], A[5], A[10]
    

    [Название файла: taskArray8.pas]

    Циклический сдвиг

    Пример: сдвинуть элементы массива влево на 1 позицию, первый элемент становится на место последнего.
    циклический сдвиг

    Решение:

    Алгоритм:
    A[1]:=A[2]; A[2]:=A[3];… A[N-1]:=A[N];

    Программа:
    сдвиг элементов массива


    PascalABC.NET:

    Циклический сдвиг влево:

      // …
      var v := a[0];
      for var i:=0 to a.Length-2 do
        a[i] := a[i+1];
      a[a.Length-1] := v;

    Циклический сдвиг вправо:

      // …
      var v := a[a.Length-1];
      for var i:=a.Length-1 downto 1 do
        a[i] := a[i-1];
      a[0] := v;

    Задача Array 9. Заполнить массив из 10 элементов случайными числами в интервале [-10..10] и выполнить циклический сдвиг влево без первого элемента.
    Пример:

    Исходный массив:
      4  -5   3  10  -4  -6   8 -10  1  0
    Результат:
      4   3  10  -4  -6   8 -10   1  0 -5
    

    [Название файла: taskArray9.pas]

    Перестановка элементов в массиве

    Рассмотрим, как происходит перестановка или реверс массива.

    Пример: переставить элементы массива в обратном порядке
    реверс массива

    Решение:

    Алгоритм:
    алгоритм перестановки элементов массива

    Псевдокод:
    2

    Программа:
    перестановка элементов массива


    PascalABC.NET:

    Перестановка (ревёрс):

    Решение 1:

    begin
    var a: array of integer := (1,3,5,7); 
    var n := a.Length;
    for var i:=0 to n div 2 - 1 do
        Swap(a[i],a[n-i-1]);
    End.

    Решение 2 (стандартная процедура Reverse()):

    begin
    var a:=new integer[10];
    a:=arrRandomInteger(10);
    print(a);// [41,81,84,63,12,26,88,25,36,72] 
    Reverse(a);
    print(a) //[72,36,25,88,26,12,63,84,81,41] 
    end.

    Задача Array 10. Заполнить массив из 10 элементов случайными числами в интервале [-10..10] и сделать реверс всех элементов, кроме последнего.
    Пример:

     Исходный массив:
    -5  3   10  -4  -6   8 -10  1   0  4
     Результат:
    0  1  -10   8  -6  -4  10  3  -5  4
    

    [Название файла: taskArray10.pas]

    Выбор элементов и сохранение в другой массив

    Пример: найти в массиве элементы, удовлетворяющие некоторому условию (например, отрицательные), и скопировать их в другой массив
    выбор элементов массива

    Решение:

    Решение: подсчитывать количество найденных элементов с помощью счетчика count, очередной элемент устанавливать на место B[count]. Переменой count необходимо присвоить 1.

    сохранение элементов массива в другой
    Вывод массива B:

    writeln('Выбранные элементы');
    for i:=1 to count-1 do
       write(B[i], ' ')

    PascalABC.NET:

    Процедура SetLength():

    // ...
    for var i := 0 to a.length - 1 do 
        if a[i] < 0 then
        begin
          b[j] := a[i];
          j += 1;
        end;
      SetLength(b, j);

    Задача Array 11. Заполнить массив случайными числами в интервале [20,100] и записать в другой массив все числа, которые оканчиваются на 0.
    Пример:

    	 Исходный массив:
    	 40   57   30  71  84
    	 Заканчиваются на 0:
    	 40 30
    

    [Название файла: taskArray11.pas]

    Сортировка элементов массива

    Сортировка методом «Пузырька»

    • В таком типе сортировок массив представляется в виде воды, маленькие элементы — пузырьки в воде, которые всплывают наверх (самые легкие).
    • При первой итерации цикла элементы массива попарно сравниваются между собой:предпоследний с последним, пред предпоследний с предпоследним и т.д. Если предшествующий элемент оказывается больше последующего, то производится их обмен.
    • При второй итерации цикла нет надобности сравнивать последний элемент с предпоследним. Последний элемент уже стоит на своем месте, он самый большой. Значит, число сравнений будет на одно меньше. То же самое касается каждой последующей итерации.

    сортировка методом пузырька

    Pascal PascalABC.NET
    1
    2
    3
    4
    5
    6
    7
    8
    
    for i:=1 to N-1 do begin
       for j:=N-1 downto i do
         if A[j] > A[j+1] then begin
           с := A[j];
           A[j] := A[j+1];
           A[j+1] := с;
         end;
     end;
    1
    2
    3
    4
    
    for var i := 0 to arr.High - 1 do
        for var j := arr.High - 1 downto i do
          if arr[j] > arr[j + 1] then 
            Swap(arr[j], arr[j + 1]);

    Задача Array 12. Заполнить массив из 10 элементов случайными числами в интервале [0..100] и отсортировать первую половину массива по возрастанию, а вторую – по убыванию (методом ‘Пузырька’).

    Пример:
    Исходный массив:
    14  25  13  30  76  58  32  11  41  97
    Результат:
    13  14  25  30  76  97  58  41  32  11

    [Название файла: taskArray12.pas]

    Сортировка методом выбора

    • в массиве ищется минимальный элемент и ставится на первое место (меняется местами с A[1]);
    • среди оставшихся элементов также производится поиск минимального, который ставится на второе место (меняется местами с A[2]) и т.д.

    сортировка методом вставки

    Pascal PascalABC.NET
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    for i := 1 to N-1 do begin
      min:= i ;
      for j:= i+1 to N do
        if A[j] < A[min] then min:=j; 
      if min <> i then begin
        c:=A[i]; 
        A[i]:=A[min]; 
        A[min]:=c;
      end;
    end;
    1
    2
    3
    4
    5
    6
    7
    8
    
    for var i := 0 to a.High-1 do
      begin
        var (min,imin) := (a[i],i);
        for var j := i + 1 to a.High do
          if a[j] < min then
            (min,imin) := (a[j],j);
        Swap(a[imin],a[i]);
      end;

    Задача Array 13: Заполнить массив из 10 элементов случайными числами в интервале [0..50] и отсортировать его по возрастанию суммы цифр

    Пример:
    Исходный массив:
    14  25  13  12  76  58  21  87  10  98
    Результат:
    10  21  12  13  14  25  76  58  87  98  
    

    [Название файла: taskArray13.pas]


    PascalABC.NET:

    Стандартная процедура sort():

    Sort(a);
    SortByDescending(a);

    Быстрая сортировка или quick sort

    Алгоритм:

    1. Выбирается и запоминается средний элемент массива (присвоим X):
    2. быстрая сортировка

    3. Инициализируем две переменные (будущие индексы массива): L:=1, R:=N (N — количество элементов).
    4. Увеличиваем L и ищем первый элемент A[L], который больше либо равен X (в итоге он должен находиться справа).
    5. Уменьшаем R и ищем элемент A[R], который меньше либо равен X (в итоге он должен находиться слева).
    6. Смотрим, если L<=R, то меняем местами A[L] и A[R], возвращаемся к пункту 3.

    быстрая сортировка паскаль

    Выполнение на Паскале:
    1

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    procedure QSort ( first, last: integer);
    var L, R, c, X: integer;
    begin
      if first < last then begin
        X:= A[(first + last) div 2];
        L:= first; R:= last;
     while L <= R do begin
       while A[L] < X do L:= L + 1;
       while A[R] > X do R:= R - 1;
       if L <= R then begin
         c:= A[L]; A[L]:= A[R]; A[R]:= c;
         L:= L + 1; R:= R - 1;
       end;
     end;
      QSort(first, R);   QSort(L, last);
      end;
    end.

    Задача Array 14:
    Заполнить массив из 10 элементов случайными числами в интервале [-50..50] и отсортировать его с помощью алгоритма быстрой сортировки.

    [Название файла: taskArray14.pas]

    Добавить комментарий