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