10template <class RandomIt, class Compare = std::less<typename std::iterator_traits<RandomIt>::value_type>>
11void bubble_sort(RandomIt first, RandomIt last, Compare comp = Compare()) {
12 using Distance =
typename std::iterator_traits<RandomIt>::difference_type;
13 Distance n = std::distance(first, last);
14 for (Distance i = 0; i < n - 1; i++) {
15 for (Distance j = 0; j < n - 1; j++) {
16 if (!comp(*(first + j), *(first + j + 1))) {
17 std::swap(*(first + j), *(first + j + 1));
23template <class RandomIt, class Compare = std::less<typename std::iterator_traits<RandomIt>::value_type>>
24void selection_sort(RandomIt first, RandomIt last, Compare comp = Compare()) {
25 using Distance =
typename std::iterator_traits<RandomIt>::difference_type;
26 Distance n = std::distance(first, last);
27 for (Distance i = 0; i < n - 1; i++) {
28 Distance min_index = i;
29 for (Distance j = i + 1; j < n; j++) {
30 if (comp(*(first + j), *(first + min_index))) {
35 std::swap(*(first + i), *(first + min_index));
40template <class RandomIt, class Compare = std::less<typename std::iterator_traits<RandomIt>::value_type>>
41RandomIt
partition(RandomIt first, RandomIt last,
const Compare& comp = Compare()) {
42 using value_type =
typename std::iterator_traits<RandomIt>::value_type;
43 value_type pivotkey = *first;
44 while (first != last) {
45 while (first != last && !comp(*(last - 1), pivotkey)) last--;
46 if (first != last) *first++ = *(last - 1);
48 while (first != last && comp(*first, pivotkey)) first++;
49 if (first != last) *(last - 1) = *first;
55template <class RandomIt, class Compare = std::less<typename std::iterator_traits<RandomIt>::value_type>>
56void quick_sort(RandomIt first, RandomIt last, Compare comp = Compare()) {
57 if (std::distance(first, last) > 1) {
65template <class RandomIt, class Compare = std::less<typename std::iterator_traits<RandomIt>::value_type>>
66void merge(RandomIt first, RandomIt mid, RandomIt last, Compare comp = Compare()) {
67 using value_type =
typename std::iterator_traits<RandomIt>::value_type;
68 using Distance =
typename std::iterator_traits<RandomIt>::difference_type;
69 Distance n = std::distance(first, last);
71 value_type *tmp =
new value_type[n];
72 RandomIt i = first, j = mid;
74 while (i < mid && j < last) {
81 while (i < mid) *k++ = *i++;
82 while (j < last) *k++ = *j++;
84 std::copy(tmp, tmp + n, first);
88template <class RandomIt, class Compare = std::less<typename std::iterator_traits<RandomIt>::value_type>>
89void merge_sort(RandomIt first, RandomIt last, Compare comp = Compare()) {
90 using Distance =
typename std::iterator_traits<RandomIt>::difference_type;
91 Distance n = std::distance(first, last);
94 RandomIt mid = first + n / 2;
100template <class RandomIt, class Compare = std::less<typename std::iterator_traits<RandomIt>::value_type>>
101void insert_sort(RandomIt first, RandomIt last, Compare comp = Compare()) {
102 using Distance =
typename std::iterator_traits<RandomIt>::difference_type;
103 using value_type =
typename std::iterator_traits<RandomIt>::value_type;
104 Distance n = std::distance(first, last);
106 for (Distance i = 1; i < n; i++) {
107 if (comp(*(first + i), *(first + i - 1))) {
108 value_type x = *(first + i);
110 for (j = i - 1; j >= 0 && comp(x, *(first + j)); j--) *(first + j + 1) = *(first + j);
111 *(first + j + 1) = x;
118template <
class RandomIt,
class Distance,
119 class Compare = std::less<typename std::iterator_traits<RandomIt>::value_type>>
120void shell_insert(RandomIt first, RandomIt last, Distance dk, Compare comp = Compare()) {
121 using value_type =
typename std::iterator_traits<RandomIt>::value_type;
122 Distance n = std::distance(first, last);
123 for (Distance i = 0; i < dk; i++) {
124 for (Distance j = i + dk; j < n; j += dk) {
125 if (comp(*(first + j), *(first + j - dk))) {
126 value_type x = *(first + j);
128 for (k = j - dk; k >= 0 && comp(x, *(first + k)); k -= dk) {
129 *(first + k + dk) = *(first + k);
131 *(first + k + dk) = x;
137template <class RandomIt, class Compare = std::less<typename std::iterator_traits<RandomIt>::value_type>>
138void shell_sort(RandomIt first, RandomIt last, Compare comp = Compare()) {
139 using Distance =
typename std::iterator_traits<RandomIt>::difference_type;
140 Distance n = std::distance(first, last);
142 for (Distance dk = (n + 1) / 2; dk > 1; dk = (dk + 1) / 2) {
154 int *count =
new int[max]{0};
155 for (
int i = 0; i < n; i++) {
160 for (
int i = 0; i < max; i++) {
161 for (
int j = 0; j < count[i]; j++) A[index++] = i;
172 int *tmp =
new int[n];
176 for (
int i = 0; i < d; i++) {
179 int *arr1 = (flag == 0 ? A : tmp);
180 int *arr2 = (flag == 0 ? tmp : A);
182 for (
int j = 0; j < 10; j++) {
186 for (
int j = 0; j < n; j++) {
187 int base = (arr1[j] % factor) / (factor / 10);
192 for (
int j = 9; j > 0; j--) count[j] = count[j - 1];
194 for (
int j = 1; j < 10; j++) count[j] += count[j - 1];
196 for (
int j = 0; j < n; j++) {
197 int base = (arr1[j] % factor) / (factor / 10);
198 arr2[count[base]++] = arr1[j];
205 for (
int i = 0; i < n; i++) {
219 std::vector<int> *tmp =
new std::vector<int>[m];
220 int distance = max - min;
221 int count = (distance - 1) / m + 1;
222 for (
int i = 0; i < n; i++) {
223 tmp[(A[i] - min) / count].emplace_back(A[i]);
227 for (
int i = 0; i < m; i++) {
229 for (
size_t j = 0; j < tmp[i].size(); j++) {
230 A[index++] = tmp[i][j];
Definition: algorithm.h:10
void shell_insert(RandomIt first, RandomIt last, Distance dk, Compare comp=Compare())
Definition: sort.h:120
void shell_sort(RandomIt first, RandomIt last, Compare comp=Compare())
Definition: sort.h:138
void merge(RandomIt first, RandomIt mid, RandomIt last, Compare comp=Compare())
将有序的[first, mid) 和 [mid, last) 合并为有序的 [first, last)
Definition: sort.h:66
void bubble_sort(RandomIt first, RandomIt last, Compare comp=Compare())
Definition: sort.h:11
void bucket_sort(int A[], int n, int min, int max, int m)
Definition: sort.h:218
void radix_sort(int A[], int n, int d)
Definition: sort.h:171
void selection_sort(RandomIt first, RandomIt last, Compare comp=Compare())
Definition: sort.h:24
RandomIt partition(RandomIt first, RandomIt last, const Compare &comp=Compare())
Definition: sort.h:41
void quick_sort(RandomIt first, RandomIt last, Compare comp=Compare())
Definition: sort.h:56
void counting_sort(int A[], int n, int max)
Definition: sort.h:152
void merge_sort(RandomIt first, RandomIt last, Compare comp=Compare())
Definition: sort.h:89
void insert_sort(RandomIt first, RandomIt last, Compare comp=Compare())
Definition: sort.h:101