add: quick sort split array
This commit is contained in:
parent
a3d60a1acc
commit
7a7656ad26
@ -44,6 +44,7 @@ GCCを使用してコンパイルしています。
|
||||
|
||||
- 2022/04/22 q_sort
|
||||
- 2022/04/26 quick_sort
|
||||
- 2022/04/28 array_quick_sort
|
||||
|
||||
#### 処理内容
|
||||
|
||||
|
BIN
quick_sort/array_quick_sort
Executable file
BIN
quick_sort/array_quick_sort
Executable file
Binary file not shown.
118
quick_sort/array_quick_sort.c
Normal file
118
quick_sort/array_quick_sort.c
Normal file
@ -0,0 +1,118 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
|
||||
int
|
||||
array_copy(
|
||||
int *array1,
|
||||
int *array2,
|
||||
int array2_size
|
||||
)
|
||||
{
|
||||
int i;
|
||||
|
||||
for ( i = 0 ; i < array2_size ; i++ ) {
|
||||
array1[i] = array2[i];
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
quick_sort(
|
||||
int *array,
|
||||
int left,
|
||||
int right
|
||||
)
|
||||
{
|
||||
int *group_small;
|
||||
int *group_large;
|
||||
int small_index = 0;
|
||||
int small_size = 0;
|
||||
int large_index = 0;
|
||||
int large_size = 0;
|
||||
|
||||
int i = 0;
|
||||
int range = right - left;
|
||||
int pivot;
|
||||
int pivot_index = 0;
|
||||
|
||||
if ( left >= right ) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
group_small = (int *)malloc(sizeof(int) * range);
|
||||
if ( group_small == NULL ) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
group_large = (int *)malloc(sizeof(int) * range);
|
||||
if ( group_large == NULL ) {
|
||||
free(group_small);
|
||||
return -1;
|
||||
}
|
||||
|
||||
pivot = array[left];
|
||||
|
||||
for ( i = left + 1 ; i <= right ; i++ ) {
|
||||
if ( array[i] < pivot ) {
|
||||
group_small[small_index] = array[i];
|
||||
small_index++;
|
||||
small_size++;
|
||||
} else {
|
||||
group_large[large_index] = array[i];
|
||||
large_index++;
|
||||
large_size++;
|
||||
}
|
||||
}
|
||||
|
||||
pivot_index = left + small_size;
|
||||
|
||||
array_copy(array + left, group_small, small_size);
|
||||
array[pivot_index] = pivot;
|
||||
array_copy(array + pivot_index + 1, group_large, large_size);
|
||||
|
||||
free(group_small);
|
||||
free(group_large);
|
||||
|
||||
quick_sort(array, left, pivot_index - 1);
|
||||
quick_sort(array, pivot_index + 1, right);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
main(
|
||||
int argc,
|
||||
char *argv[]
|
||||
)
|
||||
{
|
||||
int i;
|
||||
|
||||
int length = 200;
|
||||
int rand_limit = 100;
|
||||
|
||||
if ( argc > 1 ) {
|
||||
length = atoi(argv[1]);
|
||||
}
|
||||
|
||||
int array[length];
|
||||
|
||||
srand((int)time(NULL));
|
||||
|
||||
for ( i = 0 ; i < length ; i++ ) {
|
||||
array[i] = rand() % rand_limit + 1;
|
||||
}
|
||||
|
||||
time_t start_at = time(NULL);
|
||||
quick_sort(array, 0, length - 1);
|
||||
time_t end_at = time(NULL);
|
||||
|
||||
for ( i = 0 ; i < length ; i++ ) {
|
||||
printf("%d\n", array[i]);
|
||||
}
|
||||
|
||||
printf("elapsed: %lds\n", end_at - start_at);
|
||||
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user