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/22 q_sort
|
||||||
- 2022/04/26 quick_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