Skip to content

Commit 455d75e

Browse files
committed
added quick sort U w U
1 parent 25995cc commit 455d75e

9 files changed

Lines changed: 676 additions & 2 deletions

File tree

.idea/dbnavigator.xml

Lines changed: 458 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ ALgorithms implemented yet so far are
2222
- Insertion sort
2323
- Heap sort
2424
- Merge sort
25+
- Quick sort
2526
- Sieve of Eratosthenes
2627
- N Queen Backtracking
2728
- Graham Scan for Convex Hull

src/algorithms/quickSort.js

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
let values = [];
2+
3+
export function quickSort(rects2){
4+
let rects = rects2.slice();
5+
values = [];
6+
let sz = rects2.length;
7+
// console.log( "fdsfsd",sz );
8+
sz = sz-1;
9+
quick(rects,0,sz);
10+
for(var i=0;i<=sz;i++){
11+
values.push({
12+
xx:i,
13+
yy:i,
14+
changed:true
15+
})
16+
}
17+
return values;
18+
}
19+
20+
21+
function getPartition(rects, left, right){
22+
let pivot = rects[right].width
23+
let it = left-1;
24+
for(var j=left;j<=right-1;j++){
25+
if( rects[j].width< pivot){
26+
it++;
27+
if( it!==j ){
28+
// swap(rects[it],rects[j];
29+
const rect1 = {...rects[it]};
30+
const rect2 = {...rects[j]};
31+
rects[it] = rect2;
32+
rects[j] = rect1;
33+
values.push({
34+
xx:it,
35+
yy:j,
36+
changed:true
37+
})
38+
}
39+
}
40+
}
41+
if( it+1!==right ){
42+
const rect1 = {...rects[it+1]};
43+
const rect2 = {...rects[right]};
44+
rects[it+1] = rect2;
45+
rects[right] = rect1;
46+
values.push({
47+
xx:it+1,
48+
yy:right,
49+
changed:true
50+
})
51+
}
52+
return it+1;
53+
}
54+
function quick(rects,left,right){
55+
if( left>=right ) return ;
56+
const partition = getPartition(rects,left,right);
57+
quick(rects,left,partition-1);
58+
quick(rects,partition+1,right);
59+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
let values = [];
2+
3+
export function quickSortRecursive(rects2){
4+
let rects = rects2.slice();
5+
values = [];
6+
let sz = rects2.length;
7+
// console.log( "fdsfsd",sz );
8+
sz = sz-1;
9+
quick(rects,0,sz);
10+
return values;
11+
}
12+
13+
14+
function getPartition(rects, left, right){
15+
values.push({
16+
left,
17+
right,
18+
swap:false,
19+
changedRange:true,
20+
})
21+
let pivot = rects[right].width
22+
let it = left-1;
23+
for(var j=left;j<=right-1;j++){
24+
if( rects[j].width< pivot){
25+
it++;
26+
if( it!==j ){
27+
// swap(rects[it],rects[j];
28+
const rect1 = {...rects[it]};
29+
const rect2 = {...rects[j]};
30+
rects[it] = rect2;
31+
rects[j] = rect1;
32+
values.push({
33+
left:it,
34+
right:j,
35+
swap:true,
36+
changedRange:false,
37+
})
38+
}
39+
}
40+
}
41+
if( it+1!==right ){
42+
const rect1 = {...rects[it+1]};
43+
const rect2 = {...rects[right]};
44+
rects[it+1] = rect2;
45+
rects[right] = rect1;
46+
values.push({
47+
left:it+1,
48+
right:right,
49+
swap:true,
50+
changedRange:false,
51+
})
52+
}
53+
return it+1;
54+
}
55+
function quick(rects,left,right){
56+
if( left>=right ) return ;
57+
const partition = getPartition(rects,left,right);
58+
quick(rects,left,partition-1);
59+
quick(rects,partition+1,right);
60+
}

src/recursiveSortComponents/rect.jsx

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,11 @@ class Rect extends Component {
77
<div
88
className='rect'
99
style={{height:this.props.rect.width,
10+
border: this.checkBorder(),
1011
background:this.checkColor(),
1112
margin:this.props.marg
13+
14+
1215
}}
1316
>
1417

@@ -28,6 +31,13 @@ class Rect extends Component {
2831
return "#ADD8E6";
2932
}
3033
}
34+
checkBorder = () =>{
35+
if( this.props.rect.isRange ){
36+
return "0px solid black";
37+
} else{
38+
return "0px"
39+
}
40+
}
3141
}
3242

3343
export default Rect;

src/recursiveSortComponents/recursiveSort.js

Lines changed: 78 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import Rect from "./rect";
33
import Rects from "./rects";
44
import mergeSort from '../algorithms/mergeSort';
55
import heapSort from "../algorithms/heapSort";
6+
import {quickSortRecursive} from "../algorithms/quickSortRecursive";
67
import Navbar from "./navbar";
78
import 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];

src/recursiveSortComponents/simpleSelect.jsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ const SimpleSelect = (props) => {
4040
>
4141
<MenuItem value={0} style={{selected:true}} >Merge Sort</MenuItem>
4242
<MenuItem value={1} style={{selected:true}} >Heap Sort</MenuItem>
43+
<MenuItem value={2} style={{selected:true}} >Quick Sort</MenuItem>
4344
</Select>
4445
</FormControl>
4546
</div>

src/sortComponents/simpleSelect.jsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ const SimpleSelect = (props) => {
4141
<MenuItem value={0} style={{selected:true}} >Bubble Sort</MenuItem>
4242
<MenuItem value={1}>Selection Sort</MenuItem>
4343
<MenuItem value={2}>Insertion Sort</MenuItem>
44+
<MenuItem value={3}>Quick Sort</MenuItem>
4445
</Select>
4546
</FormControl>
4647
</div>

src/sortComponents/sort.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import React, {Component} from 'react';
22
import Rect from "./rect";
33
import Rects from "./rects";
44
import {bubbleSort,selectionSort,insertionSort} from "../algorithms/sortingAlgorithms";
5+
import {quickSort} from "../algorithms/quickSort";
56
import Navbar from "./navbar";
67
import Menu from "./menu";
78

@@ -102,6 +103,10 @@ class Sort extends Component {
102103
case 2:
103104
steps1 = insertionSort(this.state.rects);
104105
break;
106+
case 3:
107+
steps1 = quickSort(this.state.rects2);
108+
console.log(steps1)
109+
break;
105110
default:
106111
steps1 = bubbleSort(this.state.rects);
107112
break;
@@ -119,6 +124,9 @@ class Sort extends Component {
119124
case 2:
120125
steps2 = insertionSort(this.state.rects2);
121126
break;
127+
case 3:
128+
steps2 = quickSort(this.state.rects2);
129+
break;
122130
default:
123131
steps2 = bubbleSort(this.state.rects2);
124132
break;

0 commit comments

Comments
 (0)