1
1
import "./App.css" ;
2
2
import { useState } from "react" ;
3
3
import Chart from "./components/Chart/Chart" ;
4
+ import Select from "./components/Select/Select" ;
5
+ import Button from "./components/Button/Button" ;
4
6
import { useEffect } from "react" ;
5
7
8
+ import generateArray from "./helpers/generateArray" ;
9
+ import bubbleSort from "./helpers/bubbleSort" ;
10
+ import selectionSort from "./helpers/selectionSort" ;
11
+
6
12
function App ( ) {
7
13
const [ data , setData ] = useState ( [ ] ) ;
8
14
const [ isSorting , setIsSorting ] = useState ( false ) ;
9
15
const [ currIJ , setCurrIJ ] = useState ( { i : - 1 , j : - 1 } ) ;
10
16
const [ completed , setCompleted ] = useState ( [ ] ) ;
11
17
const [ size , setSize ] = useState ( 10 ) ;
12
18
const [ speed , setSpeed ] = useState ( 1 ) ;
13
-
14
- // console.log(completed);
15
- console . log ( completed ) ;
19
+ const [ algType , setAlgType ] = useState ( 0 ) ;
16
20
17
21
useEffect ( ( ) => {
18
22
const arr = generateArray ( size ) ;
19
23
setCompleted ( [ ] ) ;
20
24
setData ( [ ...arr ] ) ;
21
- } , [ size ] ) ;
22
-
23
- const generateArray = ( size ) => {
24
- const arr = [ ] ;
25
- for ( let i = 0 ; i < size ; i ++ ) {
26
- const num = Math . round ( Math . random ( ) * 100 ) + 1 ;
27
- // console.log(num);
28
- arr . push ( num ) ;
29
- }
30
- return [ ...arr ] ;
31
- } ;
25
+ } , [ size , speed , algType ] ) ;
32
26
33
27
const alterStateAfterTimeOut = ( arr , i , j , c , cond , index ) => {
34
28
setTimeout (
@@ -43,6 +37,9 @@ function App() {
43
37
return [ ...next ] ;
44
38
} ) ;
45
39
}
40
+ if ( i === - 1 && j === - 1 ) {
41
+ setIsSorting ( false ) ;
42
+ }
46
43
} ,
47
44
( 500 * c ) / speed ,
48
45
[ ...arr ] ,
@@ -53,111 +50,70 @@ function App() {
53
50
) ;
54
51
} ;
55
52
56
- const bubbleSort = ( ) => {
57
- const array = [ ...data ] ;
58
- let count = 0 ;
59
- for ( let i = 0 ; i < array . length - 1 ; i ++ ) {
60
- for ( let j = 0 ; j < array . length - i - 1 ; j ++ ) {
61
- alterStateAfterTimeOut (
62
- array ,
63
- j ,
64
- j + 1 ,
65
- count ,
66
- j === 0 ,
67
- array . length - i
68
- ) ;
69
- count ++ ;
70
- if ( array [ j ] > array [ j + 1 ] ) {
71
- let temp = array [ j ] ;
72
- array [ j ] = array [ j + 1 ] ;
73
- array [ j + 1 ] = temp ;
74
- // console.log(arr);
75
- }
76
- }
77
- }
78
- alterStateAfterTimeOut ( array , 0 , 1 , count , true , 1 ) ;
79
- alterStateAfterTimeOut ( array , 0 , 1 , count , true , 0 ) ;
80
- alterStateAfterTimeOut ( array , - 1 , - 1 , count ) ;
81
- } ;
82
-
83
- const selectionSort = ( ) => {
84
- const array = [ ...data ] ;
85
- let count = 0 ;
86
- for ( let i = 0 ; i < array . length ; i ++ ) {
87
- let index = i ;
88
- for ( let j = i + 1 ; j < array . length ; j ++ ) {
89
- alterStateAfterTimeOut ( array , i , j , count , j === i + 1 , i - 1 ) ;
90
- count ++ ;
91
- if ( array [ index ] > array [ j ] ) {
92
- index = j ;
93
- // console.log(arr);
94
- }
95
- }
96
- let temp = array [ i ] ;
97
- array [ i ] = array [ index ] ;
98
- array [ index ] = temp ;
99
- }
100
- alterStateAfterTimeOut (
101
- array ,
102
- array . length - 1 ,
103
- array . length - 2 ,
104
- count ,
105
- true ,
106
- array . length - 2
107
- ) ;
108
- alterStateAfterTimeOut (
109
- array ,
110
- array . length - 1 ,
111
- array . length - 2 ,
112
- count ,
113
- true ,
114
- array . length - 1
115
- ) ;
116
- } ;
117
-
118
53
const sortClickHandler = ( ) => {
119
54
setCompleted ( [ ] ) ;
120
55
setIsSorting ( true ) ;
121
- // bubbleSort();
122
- selectionSort ( ) ;
123
- setIsSorting ( false ) ;
56
+ algorithms [ algType ] ( alterStateAfterTimeOut , data ) ;
124
57
} ;
125
58
126
59
const randomizeClickHandler = ( ) => {
60
+ setCompleted ( [ ] ) ;
127
61
const arr = generateArray ( size ) ;
128
62
setData ( [ ...arr ] ) ;
129
63
} ;
130
64
131
65
const sizeChangeHandler = ( e ) => {
132
66
setSize ( + e . target . value ) ;
133
- // console.log(e.target.value);
134
67
} ;
135
68
136
69
const speedChangeHandler = ( e ) => {
137
70
setSpeed ( + e . target . value ) ;
138
71
} ;
139
72
73
+ const algChangeHandler = ( e ) => {
74
+ setAlgType ( + e . target . value ) ;
75
+ } ;
76
+
77
+ const algorithms = {
78
+ 0 : bubbleSort ,
79
+ 1 : selectionSort ,
80
+ } ;
81
+
140
82
return (
141
83
< div className = "App" >
142
84
< h1 > Sorting Visualizer</ h1 >
143
85
< Chart data = { data } currIJ = { currIJ } completed = { completed } />
144
- < button onClick = { sortClickHandler } > Sort</ button >
145
- < button onClick = { randomizeClickHandler } > Randomize</ button >
146
- < select value = { `${ size } ` } onChange = { sizeChangeHandler } >
147
- < option value = "5" > 5</ option >
148
- < option value = "10" > 10</ option >
149
- < option value = "25" > 25</ option >
150
- < option value = "50" > 50</ option >
151
- < option value = "75" > 75</ option >
152
- < option value = "100" > 100</ option >
153
- </ select >
154
- < select value = { `${ speed } ` } onChange = { speedChangeHandler } >
155
- < option value = "0.25" > 0.25x</ option >
156
- < option value = "0.5" > 0.5x</ option >
157
- < option value = "1" > 1x</ option >
158
- < option value = "2" > 2x</ option >
159
- < option value = "4" > 4x</ option >
160
- </ select >
86
+ < Button
87
+ btnName = "Sort"
88
+ onClickHandler = { sortClickHandler }
89
+ isDisabled = { isSorting }
90
+ />
91
+ < Button
92
+ btnName = "Randomize"
93
+ onClickHandler = { randomizeClickHandler }
94
+ isDisabled = { isSorting }
95
+ />
96
+ < Select
97
+ value = { algType }
98
+ onChangeHandler = { algChangeHandler }
99
+ values = { [ 0 , 1 ] }
100
+ options = { [ "Bubble Sort" , "Selection Sort" ] }
101
+ isDisabled = { isSorting }
102
+ />
103
+ < Select
104
+ value = { size }
105
+ onChangeHandler = { sizeChangeHandler }
106
+ values = { [ 5 , 10 , 25 , 50 , 75 , 100 ] }
107
+ options = { [ 5 , 10 , 25 , 50 , 75 , 100 ] }
108
+ isDisabled = { isSorting }
109
+ />
110
+ < Select
111
+ value = { speed }
112
+ onChangeHandler = { speedChangeHandler }
113
+ values = { [ 0.25 , 0.5 , 1 , 2 , 4 ] }
114
+ options = { [ "0.25x" , "0.5x" , "1x" , "2x" , "4x" ] }
115
+ isDisabled = { isSorting }
116
+ />
161
117
</ div >
162
118
) ;
163
119
}
0 commit comments