Отсортируйте
массив целых чисел в порядке неубывания.
Вход. Первая строка содержит целое число n (1 ≤ n ≤ 1000). Вторая строка содержит n целых чисел, по модулю не превышающих 2·109.
Выход. Вывести все n чисел в порядке неубывания.
Пример входа |
Пример
выхода |
5 9 2 7 1 2 |
1 2 2 7 9 |
сортировка
Для сортировки
целых чисел в неубывающем порядке достаточно воспользоваться любым алгоритмом
сортировки. Или вызвать функцию sort библиотеки шаблонов STL.
Читаем входные
данные в целочисленный массив. Сортируем массив. Выводим содержимое массива.
Входную
последовательность целых чисел будем хранить в векторе v.
vector<int>
v;
Читаем входные
данные.
scanf("%d",&n);
v.resize(n);
for(i = 0; i < n; i++)
scanf("%d",&v[i]);
Сортируем вектор v при помощи функции sort.
sort(v.begin(),v.end());
Выводим элементы
вектора v в порядке неубывания.
for(i = 0; i < n; i++)
printf("%d ",v[i]);
printf("\n");
Реализация алгоритма – STL sort, массив
Входную
последовательность целых чисел будем хранить в массиве m.
#define MAX 1010
int m[MAX];
Читаем входные
данные.
scanf("%d",&n);
for(i = 0; i < n; i++)
scanf("%d",&m[i]);
Сортируем массив m при помощи
функции sort.
sort(m,m+n);
Выводим элементы
массива m в порядке неубывания.
for(i = 0; i < n; i++)
printf("%d ",m[i]);
printf("\n");
STL sort – компаратор
#include <cstdio>
#include <algorithm>
#define MAX 1010
using namespace std;
int m[MAX];
int i, n;
int f(int a, int b)
{
return a < b;
}
int main(void)
{
scanf("%d",&n);
for(i = 0; i < n; i++)
scanf("%d",&m[i]);
sort(m,m+n,f);
for(i = 0; i < n; i++)
printf("%d ",m[i]);
printf("\n");
return 0;
}
Обменная Сортировка
#include <stdio.h>
#define MAX 1000
int m[MAX];
int i, n;
void sort(void)
{
int i, j,
temp;
for(i = 0; i
< n; i++)
for(j = i +
1; j < n; j++)
if (m[i]
> m[j])
{
temp = m[i];
m[i] = m[j];
m[j] = temp;
}
}
int main(void)
{
scanf("%d",&n);
for(i = 0; i
< n; i++)
scanf("%d",&m[i]);
sort();
for(i = 0; i
< n; i++)
printf("%d ",m[i]);
printf("\n");
return 0;
}
Сортировка кучей
#include <stdio.h>
#define MAX 1001
int a[MAX];
int n;
int left(int i)
{
return 2 * i;
}
int right(int i)
{
return 2 * i + 1;
}
void swap(int
&i, int &j)
{
int temp
= i; i = j; j =
temp;
}
// max - heap
void heapify(int a[], int i, int n) // n
= size of a heap
{
int
largest = 0;
int l =
left(i);
int r =
right(i);
if (l
<= n && a[l] > a[i])
largest = l;
else
largest = i;
if (r
<= n && a[r] > a[largest])
largest = r;
if
(largest != i)
{
swap(a[i], a[largest]);
heapify(a,
largest, n);
}
}
void BuildHeap(int a[], int n)
{
for (int i = n / 2;
i > 0; i--)
heapify(a, i, n);
}
void HeapSort(int a[], int n)
{
BuildHeap(a, n);
for (int i = n; i
>= 2; i--)
{
swap(a[1], a[i]);
heapify(a, 1,
i - 1);
}
}
int main(void)
{
scanf("%d",
&n);
for (int i =
1; i <= n; i++)
scanf("%d",
&a[i]);
HeapSort(a,
n);
for (int i =
1; i <= n; i++)
printf("%d
", a[i]);
printf("\n");
return 0;
}
Сортировка кучей – STL
Читаем входные
данные.
scanf("%d",&n);
v.resize(n);
for(i = 0; i < n; i++)
scanf("%d",&v[i]);
Преобразуем массив чисел в кучу.
make_heap(v.begin(),v.end());
Удаление
наибольшего элемента из кучи. Функция pop_heap меняет местами
первый и последний элементы, уменьшает величину кучи на 1 и восстанавливает
свойство кучи.
for(i = v.size(); i > 0; i--)
pop_heap(v.begin(),v.begin() + i);
Выводим отсортированный массив.
for(i = 0; i < v.size(); i++)
printf("%d ",v[i]);
printf("\n");
Быстрая сортировка
Сортирующий массив
храним в массиве m.
int m[1010];
Перестановка
пары элементов массива m.
void swap(int &i, int &j)
{
int temp = i;
i = j; j = temp;
}
В качестве опорного выбираем самый
левый элемент m[L]. Разделяем массив.
int Partition(int
L, int R)
{
int x = m[L],
i = L - 1, j = R + 1;
while(1)
{
do j--; while (m[j] > x);
do i++; while (m[i] < x);
if (i <
j) swap(m[i],m[j]); else return j;
}
}
Быстрая сортировка подмассива
m[L..R].
void QuickSort(int
L, int R)
{
int q;
if (L < R)
{
q =
Partition(L, R);
QuickSort(L,q); QuickSort(q+1,R);
}
}
Основная часть программы.
scanf("%d",&n);
for(i = 0; i < n; i++) scanf("%d",&m[i]);
QuickSort(0,n-1);
printf("%d",m[0]);
for(i = 1; i < n; i++) printf(" %d",m[i]);
printf("\n");
Сортировка слиянием + классы
#include <stdio.h>
#include <string.h>
int i, n;
class Array
{
public:
int *m;
int size;
Array(int
size = 0) : size(size)
{
m = new int[size];
}
int& operator[](int i)
{
return
m[i];
}
~Array(void)
{
delete[] m;
}
void merge(int aL, int aR, int bL, int bR)
{
// a[aL..aR]
a[bL..bR] are merged into a[aL..bR]
int ptr =
0, Left = aL, len = bR - aL + 1;
int *temp =
new int[len];
while((aL
<= aR) && (bL <= bR))
temp[ptr++] = (m[aL] < m[bL]) ?
m[aL++] : m[bL++];
while (aL
<= aR) temp[ptr++] = m[aL++];
while (bL
<= bR) temp[ptr++] = m[bL++];
memcpy(m + Left,temp,len*sizeof(int));
delete[]
temp;
}
void Sort(void)
{
Sort(0,size - 1);
}
void Sort(int left, int right)
{
if (left
< right)
{
int
middle = (left + right) / 2;
Sort(left,middle);
Sort(middle+1,right);
merge(left, middle, middle + 1, right);
}
}
};
int main(void)
{
scanf("%d",&n);
Array a(n);
for(i = 0; i
< n; i++)
scanf("%d",&a[i]);
a.Sort();
printf("%d",a[0]);
for(i = 1; i
< n; i++) printf(" %d",a[i]);
printf("\n");
return 0;
}
Java реализация
import java.util.*;
public class Main
{
public static void
main(String[] args)
{
Scanner con = new
Scanner(System.in);
int n = con.nextInt();
int m[] = new int[n];
for(int i = 0;
i < n; i++) m[i] = con.nextInt();
Arrays.sort(m);
for(int i = 0;
i < n; i++)
System.out.print(m[i] + "
");
System.out.println();
con.close();
}
}
Java компаратор
import java.util.*;
class f implements
Comparator<Integer>
{
// a <
b means a - b < 0
public int compare(Integer
a, Integer b)
{
return a - b;
}
}
public class Main
{
public static void
main(String[] args)
{
Scanner con = new
Scanner(System.in);
int n = con.nextInt();
Integer m[] = new
Integer[n];
for(int i = 0;
i < n; i++) m[i] = con.nextInt();
Arrays.sort(m, new
f());
for(int i = 0;
i < n; i++)
System.out.print(m[i] + "
");
System.out.println();
con.close();
}
}
Java – сортировка
кучей
import java.util.*;
public class Main
{
static int
left(int i)
{
return 2 * i;
}
static int
right(int i)
{
return 2 * i + 1;
}
static void
swap(int a[], int i, int j)
{
int temp = a[i]; a[i] = a[j]; a[j] = temp;
}
//max
- heap
static void
heapify(int a[], int i, int n) //
n = size of a heap
{
int largest = 0;
int l = left(i);
int r = right(i);
if (l
<= n && a[l]
> a[i]) largest = l;
else largest = i;
if (r
<= n && a[r]
> a[largest]) largest = r;
if (largest != i)
{
swap(a, i, largest);
heapify(a, largest, n);
}
}
static void
BuildHeap(int a[], int n)
{
for (int i = n / 2;
i > 0; i--)
heapify(a, i, n);
}
static void
HeapSort(int a[], int n)
{
BuildHeap(a, n);
for (int i = n; i
>= 2; i--)
{
swap(a, 1, i);
heapify(a, 1, i -
1);
}
}
public static void
main(String[] args) {
Scanner con = new
Scanner(System.in);
int n = con.nextInt();
int m[] = new int[n+1];
for(int i = 1;
i <= n; i++)
m[i] = con.nextInt();
HeapSort(m, n);
for(int i = 1;
i <= n; i++)
System.out.print(m[i] + "
");
System.out.println();
con.close();
}
}
Java – обменная сортировка
import java.util.*;
public class Main
{
static void
sort(int m[])
{
for(int i = 0;
i < m.length; i++)
for(int j = i + 1;
j < m.length; j++)
if (m[i]
> m[j])
{
int temp = m[i];
m[i] = m[j];
m[j] = temp;
}
}
public static void
main(String[] args)
{
Scanner con = new
Scanner(System.in);
int n = con.nextInt();
int m[] = new int[n];
for(int i = 0;
i < n; i++) m[i] = con.nextInt();
sort(m);
for(int i = 0;
i < n; i++)
System.out.print(m[i] + "
");
con.close();
}
}
Java – быстрая сортировка
import java.util.*;
public class Main
{
public static int
Partition (int[] A, int L, int R)
{
int x = A[L], i = L - 1,
j = R + 1;
while(true)
{
do j--; while (A[j]
> x);
do i++; while (A[i]
< x);
if (i <
j)
{
int temp = A[i];
A[i] = A[j];
A[j] = temp;
}
else return j;
}
}
public static void
Qsort(int[] A, int L, int R)
{
if (L <
R)
{
int q = Partition(A, L,R);
Qsort(A, L, q);
Qsort(A, q+1, R);
}
}
public static void
main(String[] args)
{
Scanner con
= new Scanner(System.in);
int n = con.nextInt();
int m[] = new int[n];
for(int i = 0;
i < n; i++) m[i] = con.nextInt();
Qsort(m,0,n-1);
for(int i = 0;
i < n - 1; i++)
System.out.print(m[i] + "
");
System.out.println(m[n-1]);
}
}
Java – динамический
массив
import java.util.*;
public class Main
{
public static class DynamicArray
{
private int[] storage;
private int size;
public DynamicArray()
{
storage = new int[100];
size = 0;
}
public DynamicArray(int capacity)
{
storage = new int[capacity];
size = 0;
}
public int length()
{
return size;
}
public void Print()
{
if (size == 0) return;
for(int i = 0; i < size - 1; i++)
System.out.print(storage[i]+ " ");
System.out.println(storage[size-1]);
}
public void ensureCapacity(int minCapacity)
{
int capacity = storage.length;
if (minCapacity > capacity)
{
int newCapacity = (capacity * 3) / 2 + 1;
if (newCapacity < minCapacity) newCapacity = minCapacity;
int temp[] = new int[newCapacity];
System.arraycopy(storage, 0, temp, 0, capacity);
storage = temp;
//storage = Arrays.copyOf(storage, newCapacity);
}
}
private void pack()
{
int capacity = storage.length;
if (size <= capacity / 2)
{
int newCapacity = (size * 3) / 2 + 1;
int temp[] = new int[newCapacity];
System.arraycopy(storage, 0, temp, 0, capacity);
storage = temp;
//storage = Arrays.copyOf(storage, newCapacity);
}
}
public void trim()
{
int newCapacity = size;
int temp[] = new int[newCapacity];
System.arraycopy(storage, 0, temp, 0, storage.length);
storage = temp;
//storage = Arrays.copyOf(storage, newCapacity);
}
private void rangeCheck(int index)
{
if (index < 0 || index >= size)
throw new
IndexOutOfBoundsException
("Index: " + index + ", Size: " + size);
}
public void set(int index, int value)
{
rangeCheck(index);
storage[index] = value;
}
public int get(int index)
{
rangeCheck(index);
return storage[index];
}
public void removeAt(int index)
{
rangeCheck(index);
int moveCount = size - index - 1;
if (moveCount > 0)
System.arraycopy(storage, index + 1, storage,
index, moveCount);
size--;
pack();
}
public void insertAt(int index, int value)
{
if (index < 0 || index > size)
throw new
IndexOutOfBoundsException
("Index: " + index + ", Size: " + size);
ensureCapacity(size + 1);
int moveCount = size - index;
if (moveCount > 0)
System.arraycopy(storage, index, storage,
index + 1, moveCount);
storage[index] = value;
size++;
}
public void push_back(int value)
{
ensureCapacity(size +
1);
storage[size] = value;
size++;
}
public void
Sort()
{
Arrays.sort(storage,0,size);
}
}
public static void
main(String[] args)
{
Scanner con
= new Scanner(System.in);
int n = con.nextInt();
DynamicArray m = new DynamicArray(1);
for(int i = 0; i < n; i++) m.push_back(con.nextInt());
m.Sort(); m.Print();
}
}
Python реализация
n = int(input())
lst = list(map(int,input().split()))
lst.sort()
print(*lst)
Python реализация – sorted
n = int(input())
lst = map(int, input().split())
lst = sorted(lst)
for i in
range(n):
print(lst[i], end=" ")
print()
Python реализация – сортировка кучей
def heapify(lst, n, i): # n is size of heap
largest = 0
l = 2
* i # left = 2*i
r = 2
* i + 1
# right = 2*i + 1
if l <= n and lst[l] > lst[i]: largest = l
else: largest = i
if r <= n and lst[r] > lst[largest]: largest = r
if largest != i:
lst[i], lst[largest] = lst[largest], lst[i] # swap
heapify(lst, n, largest)
def BuildHeap(lst, n):
for i in range(n // 2, 0, -1):
heapify(lst, n, i)
def heapSort(lst, n):
BuildHeap(lst, n)
for i in range(n, 1, -1):
lst[i], lst[1] = lst[1], lst[i] # swap
heapify(lst, i - 1, 1)
n = int(input())
lst = list(map(int,input().split()))
lst = [0] + lst
heapSort(lst, n)
for i in range(1,n+1):
print(lst[i], end = " ")