|  | Сортировка обменомСортировка с номерами |
| Сортировка пузырьком - не меняя порядок одинаковых чисел |
| Сортировка подсчетом (черпаком) - линейная сортировка целых чисел |
| | Описаны сортировки |
| |
 |  | Сортировка по возрастанию |
| ... |
| int a[10]; |
| ... |
| sort(a,a+10); |
| ... |
| | 1 Сортировка обменом Сортировка с номерами |
| 2 Сортировка пузырьком - не меняя порядок одинаковых чисел |
| 3 Сортировка подсчетом (черпаком) - линейная сортировка целых чисел |
| |
 |  | Сортировка по убыванию |
| ... |
| int a[10]; |
| ... |
| sort(a,a+10); reverse(a,a+10); // после сортировки реверсируем массив a |
| | *Сортировка по возрастанию* |
| {quote}_..._ |
| _int a\[10\];_ |
| _..._ |
| _sort(a,a+10);_ |
| _..._{quote} |
| |
 |  | *Сортировка по убыванию* |
| {quote}_..._ |
| _int a{_}_\[10\]__;_ |
| _..._ |
| _sort(a,a+10); reverse(a,a+10); // после сортировки реверсируем массив a{_}{quote} |
| |
| Альтернатива (сортировка по убыванию ) |
 |  | sort(a,a+10,greater<int>()); |
| | {quote}{_}sort(a,a+10,greater<int>());_{quote} |
| |
 |  | *Сортировка пузырьком* \- не меняя порядок одинаковых чисел |
| {quote}_..._ |
| _int a{_}_\[10\]__;_ |
| _..._ |
| _stable_sort(a,a+10);_ |
| _..._{quote} |
| |
 |  | *Сортировка с номерами* |
| |
 |  | Сортировка пузырьком - не меняя порядок одинаковых чисел |
| ... |
| int a[10]; |
| ... |
| stable_sort(a,a+10); |
| ... |
| |
| Сортировка с номерами |
| |
| от 0 до 9 |
| |
| ввод |
 |  | int a[10],i; |
| for (i=0; i<10; i++) cin >> a[i]; |
| | {quote}{_}int a{_}_\[10\]__,i;_ |
| _for (i=0; i<10; i++) cin >> a{_}_\[i\]__;_{quote} |
| |
| добавление последней цифрой номера (для двузначных чисел умножаем на 100 и т.д) |
 |  | for (i=0; i<10; i++) a[i]=a[i]*10+i; |
| | {quote}{_}for (i=0; i<10; i++) a{_}_\[i\]__=a{_}_\[i\]__\*10+i;_{quote} |
| |
| Сортируем |
 |  | sort(a,a+10); |
| | {quote}{_}sort(a,a+10);_{quote} |
| |
| Выводим 3 первых номера после сортировки (для двузначных чисел %100 - остаток от деления на 100 и т.д) |
 |  | for (i=0; i<3; i++) cout << (a[i]%10)+1 << endl; |
| | {quote}{_}for (i=0; i<3; i++) cout << (a{_}_\[i\]__%10)+1 << endl;_{quote} |
| |
 |  | |
| Альтернатива - использование вектора |
| |
| Для сортировки с номерами можно сделать так: |
| |
 |  | vector<pair<int, int> > A(N); |
| for (int i = 0; i < N; i++) { cin >> A[i].first; A[i].second=i;}; |
| | {quote}{_}vector<pair<int, int> > A(N);_ |
| _for (int i = 0; i < N; i++)_ |
| cin >> A\[i\].first; \_bq. _A\[i\].second=i;{quote}\\ |
| |
| Выводим 3 первых номера после сортировки |
 |  | for (int i = 0; i < 3; i++) cout << A[i].second; |
| | {quote}{_}for (int i = 0; i < 3; i++) cout << A{_}_\[i\]__.second;_{quote} |
| |
 |  | |
| Пусть имеется массив из N точек с координатами x и y |
| |
 |  | Массив координат точек X,Y сортируется по возрастанию X |
| а в случае равенства X - по возрастанию Y |
| В случае, когда гарантируется, что все X различны |
| второй массив просто параллельно передвигается |
| никогда не участвуя в сравнениях |
| | Массив координат точек X,Y сортируется по возрастанию X, а в случае равенства X - по возрастанию Y |
| В случае, когда гарантируется, что все X различны, второй массив просто параллельно передвигается никогда не участвуя в сравнениях |
| |
| Например |
 |  | vector<pair<int, int> > A(N); |
| for(int i = 0; i < N; i++) |
| cin >> A[i].first >> A[i].second; |
| sort(A.begin(), A.end()); |
| | {quote}{_}vector<pair<int, int> > A(N);_ |
| _for(int i = 0; i < N; i++)_ |
| _cin >> A{_}_\[i\]__.first >> A{_}_\[i\]__.second;_ |
| _sort(A.begin(), A.end());_{quote} |
| |
 |  | |
| |
| |
| |
| Сортировка подсчетом (черпаком) |
| |
| #include <bits/stdc++.h> |
| using namespace std; |
| | *Сортировка подсчетом (черпаком)* |
| {code:title=Cherpak.cpp\|borderStyle=solid} |
| #include <bits/stdc++.h>using namespace std; |
| int main() |
| { |
| int a[15000],i,n,j; |
| for (i=0; i<15000; i++) a[i]=0; |
| cin >> n; |
| for (i=0; i<n; i++) |
| { |
| cin >> j; |
| a[j]++; |
| } |
| |
| for (i=0; i<15000; i++) |
| if (a[i]) for (j=0; j<a[i]; j++) cout << i; |
| } |
 | | {code} |