Skip to content

Commit d8d7806

Browse files
Merge pull request #102 from RichardWeiYang/master
counting sort in c
2 parents e2ac7bb + 52a1383 commit d8d7806

File tree

3 files changed

+219
-0
lines changed

3 files changed

+219
-0
lines changed

c-cpp/12_sorts/merge_sort.c

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
#include <stdio.h>
2+
#include <stdlib.h>
3+
#include <stdbool.h>
4+
#include <string.h>
5+
6+
void dump(int *arr, int size)
7+
{
8+
int idx;
9+
10+
for (idx = 0; idx < size; idx++)
11+
printf("%08d\n", arr[idx]);
12+
}
13+
14+
void __merge(int *arr, int p, int q, int r)
15+
{
16+
int *tmp;
17+
int i, j, k;
18+
19+
tmp = (int*)malloc((r - p + 1) * sizeof(int));
20+
21+
if (!tmp)
22+
abort();
23+
24+
for (i = p, j = q + 1, k = 0; i <= q && j <= r;) {
25+
if (arr[i] <= arr[j])
26+
tmp[k++] = arr[i++];
27+
else
28+
tmp[k++] = arr[j++];
29+
}
30+
31+
if (i == q + 1) {
32+
for (; j <= r;)
33+
tmp[k++] = arr[j++];
34+
} else {
35+
for (; i <= q;)
36+
tmp[k++] = arr[i++];
37+
}
38+
39+
memcpy(arr + p, tmp, (r - p + 1) * sizeof(int));
40+
free(tmp);
41+
}
42+
43+
void __merge_sort(int *arr, int p, int r)
44+
{
45+
int q;
46+
47+
if (p >= r)
48+
return;
49+
50+
q = (p + r) / 2;
51+
__merge_sort(arr, p, q);
52+
__merge_sort(arr, q + 1, r);
53+
__merge(arr, p, q, r);
54+
}
55+
56+
void merge_sort(int *arr, int size)
57+
{
58+
__merge_sort(arr, 0, size - 1);
59+
}
60+
61+
void merge_verify()
62+
{
63+
int test[10] = {5, 8, 9, 23, 67, 1, 3, 7, 31, 56};
64+
65+
__merge(test, 0, 4, 9);
66+
67+
dump(test, 10);
68+
}
69+
70+
void merge_sort_test()
71+
{
72+
int test[10] = {5, 8, 9, 23, 67, 1, 3, 7, 31, 56};
73+
74+
merge_sort(test, 10);
75+
76+
dump(test, 10);
77+
}
78+
79+
int main()
80+
{
81+
//merge_verify();
82+
merge_sort_test();
83+
return 0;
84+
}

c-cpp/12_sorts/quick_sort.c

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
#include <stdio.h>
2+
#include <stdlib.h>
3+
#include <stdbool.h>
4+
#include <string.h>
5+
6+
void dump(int *arr, int size)
7+
{
8+
int idx;
9+
10+
for (idx = 0; idx < size; idx++)
11+
printf("%08d\n", arr[idx]);
12+
}
13+
14+
void swap(int *a, int *b)
15+
{
16+
int tmp = *a;
17+
*a = *b;
18+
*b = tmp;
19+
}
20+
21+
int partition(int *arr, int p, int r)
22+
{
23+
//int pivot = arr[r];
24+
int i, j;
25+
26+
i = j = p;
27+
28+
for (; j < r; j++) {
29+
if (arr[j] < arr[r]) {
30+
swap(arr + i, arr + j);
31+
i++;
32+
}
33+
}
34+
35+
swap(arr + i, arr + r);
36+
return i;
37+
}
38+
39+
void __quick_sort(int *arr, int p, int r)
40+
{
41+
int q;
42+
43+
if (p >= r)
44+
return;
45+
46+
q = partition(arr, p, r);
47+
__quick_sort(arr, p, q-1);
48+
__quick_sort(arr, q+1, r);
49+
}
50+
51+
void quick_sort(int *arr, int size)
52+
{
53+
__quick_sort(arr, 0, size - 1);
54+
}
55+
56+
void quick_sort_test()
57+
{
58+
int test[10] = {5, 8, 9, 23, 67, 1, 3, 7, 31, 56};
59+
60+
quick_sort(test, 10);
61+
62+
dump(test, 10);
63+
}
64+
65+
int main()
66+
{
67+
quick_sort_test();
68+
return 0;
69+
}

c-cpp/14_sorts/counting_sort.c

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
#include <stdio.h>
2+
#include <stdlib.h>
3+
#include <stdbool.h>
4+
#include <string.h>
5+
6+
void dump(int *arr, int size)
7+
{
8+
int i;
9+
10+
for (i = 0; i < size; i++)
11+
printf("%08d\n", arr[i]);
12+
}
13+
14+
// content in arr must be positive integer
15+
void counting_sort(int *arr, int size)
16+
{
17+
int max, i;
18+
int *count, *tmp;
19+
20+
if (size <= 1)
21+
return;
22+
23+
max = 0;
24+
// find the biggest integer
25+
for (i = 0; i < size; i++) {
26+
if (max < arr[i])
27+
max = arr[i];
28+
}
29+
30+
// init count to 0
31+
count = (int*)malloc((max+1) * sizeof(int));
32+
tmp = (int*)malloc(size * sizeof(int));
33+
if (!count || !tmp)
34+
return;
35+
memset(count, 0, (max + 1) * sizeof(int));
36+
37+
// counting
38+
for (i = 0; i < size; i++)
39+
count[arr[i]]++;
40+
for (i = 1; i < max + 1; i++)
41+
count[i] = count[i-1] + count[i];
42+
43+
// iterate arr and put it to the correct index in tmp
44+
for (i = 0; i < size; i++){
45+
int index = count[arr[i]] - 1;
46+
tmp[index] = arr[i];
47+
count[arr[i]]--;
48+
}
49+
50+
// move back to arr
51+
memcpy(arr, tmp, size * sizeof(int));
52+
}
53+
54+
void counting_sort_test()
55+
{
56+
int test_data[10] = {3, 23, 98, 1, 27, 36, 52, 89, 76, 44};
57+
58+
counting_sort(test_data, 10);
59+
dump(test_data, 10);
60+
}
61+
62+
int main()
63+
{
64+
counting_sort_test();
65+
return 0;
66+
}

0 commit comments

Comments
 (0)