Вообщем, я смог все-таки сам решить эту задачу.
//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
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
:
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
Пример:
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
]
Перестановка элементов в массиве
Рассмотрим, как происходит перестановка или реверс массива.
Пример: переставить элементы массива в обратном порядке
Решение:
Алгоритм:
Псевдокод:
Программа:
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 | ||||
|
|
Задача 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 | ||||
|
|
Задача 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
Алгоритм:
- Выбирается и запоминается средний элемент массива (присвоим X):
- Инициализируем две переменные (будущие индексы массива): L:=1, R:=N (N — количество элементов).
- Увеличиваем L и ищем первый элемент A[L], который больше либо равен X (в итоге он должен находиться справа).
- Уменьшаем R и ищем элемент A[R], который меньше либо равен X (в итоге он должен находиться слева).
- Смотрим, если L<=R, то меняем местами A[L] и A[R], возвращаемся к пункту 3.
Выполнение на Паскале:
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
]