@@ -3,6 +3,7 @@ import Rect from "./rect";
33import Rects from "./rects" ;
44import mergeSort from '../algorithms/mergeSort' ;
55import heapSort from "../algorithms/heapSort" ;
6+ import { quickSortRecursive } from "../algorithms/quickSortRecursive" ;
67import Navbar from "./navbar" ;
78import Menu from "./menu" ;
89
@@ -83,24 +84,93 @@ class RecursiveSort extends Component {
8384
8485 this . setState ( { isRunning : true } ) ;
8586 let steps ;
87+ let rects2 ;
8688 switch ( this . state . algo ) {
89+
8790 case 0 :
8891 steps = mergeSort ( this . state . rects ) ;
8992 this . handleMerge ( steps ) ;
9093 break ;
9194 case 1 :
92- const rects2 = this . state . rects . slice ( ) ;
95+ rects2 = this . state . rects . slice ( ) ;
9396 steps = heapSort ( rects2 ) ;
9497 this . handleHeap ( steps ) ;
9598 break ;
99+ case 2 :
100+ rects2 = this . state . rects . slice ( ) ;
101+ steps = quickSortRecursive ( rects2 ) ;
102+ this . handleQuick ( steps ) ;
103+ break ;
96104 default :
97105 }
98106
99107
100108 }
109+
110+ handleQuick = async ( steps ) => {
111+ this . setState ( { isRunning : true } ) ;
112+ let prevRect = this . state . rects ;
113+ for ( let j = 0 ; j < this . state . count ; j ++ ) {
114+ prevRect [ j ] = { ...prevRect [ j ] , isLeft : false , isSorting : false , isRight :false , isRange :false , isSorted : false } ;
115+ }
116+ this . setState ( { rects : prevRect } ) ;
117+ let hasChanged = - 1 ;
118+ let changed ;
119+ for ( let i = 0 ; i < steps . length ; i ++ ) {
120+ let step = steps [ i ] ;
121+ if ( hasChanged !== - 1 ) {
122+ let { left, right} = changed ;
123+ prevRect [ left ] = { ...prevRect [ left ] , isLeft : false , isSorting : false , isRight :false , isRange :false } ;
124+ prevRect [ right ] = { ...prevRect [ right ] , isLeft : false , isSorting : false , isRight :false , isRange :false } ;
125+ }
126+ if ( step . changedRange ) {
127+ await sleep ( this . state . speed ) ; await sleep ( this . state . speed ) ; await sleep ( this . state . speed ) ; await sleep ( this . state . speed ) ;
128+ let { left, right} = step ;
129+ for ( let j = 0 ; j < this . state . count ; j ++ ) {
130+ prevRect [ j ] = { ...prevRect [ j ] , isLeft : false , isSorting : false , isRight :false , isRange :false } ;
131+ }
132+ for ( let j = left ; j <= right ; j ++ ) {
133+ prevRect [ j ] = { ...prevRect [ j ] , isLeft : false , isSorting : false , isRight :true , isRange :true } ;
134+ }
135+ this . setState ( { rects : prevRect } ) ;
136+ await sleep ( this . state . speed ) ; await sleep ( this . state . speed ) ; await sleep ( this . state . speed ) ; await sleep ( this . state . speed ) ;
137+ for ( let j = 0 ; j < this . state . count ; j ++ ) {
138+ prevRect [ j ] = { ...prevRect [ j ] , isLeft : false , isSorting : false , isRight :false } ;
139+ }
140+ } else if ( step . swap ) {
141+ let { left, right} = step ;
142+ prevRect [ left ] = { ...prevRect [ left ] , isLeft : false , isSorting : true , isRight :false , isRange :false } ;
143+ prevRect [ right ] = { ...prevRect [ right ] , isLeft : true , isSorting : false , isRight :false , isRange :false } ;
144+ let temp = prevRect [ left ] ;
145+ prevRect [ left ] = prevRect [ right ] ;
146+ prevRect [ right ] = temp ;
147+ hasChanged = 1 ;
148+ changed = step ;
149+ }
150+ this . setState ( { rects : prevRect } ) ;
151+ await sleep ( this . state . speed ) ;
152+ if ( i === steps . length - 1 ) {
153+ for ( let j = 0 ; j < this . state . count ; j ++ ) {
154+ prevRect [ j ] = { ...prevRect [ j ] , isLeft : false , isSorting : false , isRight :false , isSorted : false , isRange :false } ;
155+ }
156+ this . setState ( { rects : prevRect } ) ;
157+ for ( let j = 0 ; j < this . state . count ; j ++ ) {
158+ prevRect [ j ] = { ...prevRect [ j ] , isLeft : false , isSorting : false , isRight :false , isSorted : true , isRange :false } ;
159+ this . setState ( { rects : prevRect } ) ;
160+ await sleep ( 10 ) ;
161+ }
162+ this . setState ( { isRunning : false , rects : prevRect } ) ;
163+ }
164+ }
165+ }
101166 handleHeap = async ( steps ) => {
102167 this . setState ( { isRunning : true } ) ;
103168 let prevRect = this . state . rects ;
169+ for ( let j = 0 ; j < this . state . count ; j ++ ) {
170+ prevRect [ j ] = { ...prevRect [ j ] , isLeft : false , isSorting : false , isRight :false , isRange :false , isSorted : false } ;
171+ }
172+ this . setState ( { rects : prevRect } ) ;
173+
104174 for ( let i = 0 ; i < steps . length ; i ++ ) {
105175 let step = steps [ i ] ;
106176 // console.log(step);
@@ -117,7 +187,7 @@ class RecursiveSort extends Component {
117187 prevRect [ right ] = temp ;
118188 this . setState ( { rects : prevRect } ) ;
119189 if ( sorted ) prevRect [ left ] = { ...prevRect [ left ] , isSorted : true } ;
120- await sleep ( this . state . speed ) ;
190+ await sleep ( this . state . speed ) ; await sleep ( this . state . speed ) ; await sleep ( this . state . speed ) ;
121191 if ( i === steps . length - 1 ) {
122192
123193 for ( let i = 0 ; i < this . state . count ; i ++ ) {
@@ -131,9 +201,15 @@ class RecursiveSort extends Component {
131201 }
132202 handleMerge = async ( steps ) => {
133203 this . setState ( { isRunning1 : true } ) ;
204+
134205 const { speed} = this . state ;
135206
136207 let prevRect = this . state . rects ;
208+ for ( let j = 0 ; j < this . state . count ; j ++ ) {
209+ prevRect [ j ] = { ...prevRect [ j ] , isLeft : false , isSorting : false , isRight :false , isRange :false , isSorted : false } ;
210+ }
211+ this . setState ( { rects : prevRect } ) ;
212+ await sleep ( this . state . speed ) ;
137213 // console.log("steps ", steps.length);
138214 for ( let ii = 0 ; ii < steps . length ; ii ++ ) {
139215 let step = steps [ ii ] ;
0 commit comments