add: quick sort split array

This commit is contained in:
kemasama 2022-04-28 19:53:55 +09:00
parent a3d60a1acc
commit 7a7656ad26
3 changed files with 119 additions and 0 deletions

View File

@ -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

Binary file not shown.

View 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;
}