Skip to content

Commit 52a1383

Browse files
quick/merge sort in c
1 parent 275752f commit 52a1383

File tree

2 files changed

+153
-0
lines changed

2 files changed

+153
-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+
}

0 commit comments

Comments
 (0)