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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user