-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path105-radix_sort.c
executable file
·78 lines (71 loc) · 1.6 KB
/
105-radix_sort.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include "sort.h"
/**
* get_digit - gets a digit from a number
* @number: the integer
* @digit: the digit position to get
*
* Return: the digit value at given position
**/
int get_digit(long number, int digit)
{
long i = 0L, pow = 1L, ret;
for (i = 0; i < digit; i++)
pow *= 10L;
ret = ((number / pow) % 10);
return (ret);
}
/**
* radix_pass - sorts by radix
* @array: the integer array to sort
* @size: the size of the array
* @digit: the current digit to check
* @new_array: target array of same size
*
* Return: void.
*/
int radix_pass(int *array, ssize_t size, int digit, int *new_array)
{
ssize_t i;
int buckets[10] = {0};
for (i = 0; i < size; i++)
buckets[get_digit(array[i], digit)]++;
for (i = 1; i <= 9; i++)
buckets[i] += buckets[i - 1];
for (i = size - 1; i > -1; i--)
new_array[buckets[get_digit(array[i], digit)]-- - 1] = array[i];
return (1);
}
/**
* radix_sort - sorts by radix
* @size: the size of the array
* @array: the integer array to sort
*
* Return: the gap size
*/
void radix_sort(int *array, size_t size)
{
int *old_array, *new_array, *temp_ptr, *ptr, max = 0;
size_t i, sd = 1;
if (!array || size < 2)
return;
for (i = 0; i < size; i++)
if (array[i] > max)
max = array[i];
while (max /= 10)
sd++;
old_array = array;
new_array = ptr = malloc(sizeof(int) * size);
if (!new_array)
return;
for (i = 0; i < sd; i++)
{
radix_pass(old_array, (ssize_t)size, i, new_array);
temp_ptr = old_array;
old_array = new_array;
new_array = temp_ptr;
print_array(old_array, size);
}
for (i = 0; i < size; i++)
array[i] = old_array[i];
free(ptr);
}