feat(curriculum): add quicksort lab to frontend cert (#56009)
Co-authored-by: Sem Bauke <sem@freecodecamp.org> Co-authored-by: Dario-DC <105294544+Dario-DC@users.noreply.github.com> Co-authored-by: Oliver Eyton-Williams <ojeytonwilliams@gmail.com>pull/56027/head
parent
2910ff01df
commit
8d0550d76c
|
@ -2056,7 +2056,12 @@
|
||||||
"yshh": { "title": "237", "intro": [] },
|
"yshh": { "title": "237", "intro": [] },
|
||||||
"wyxz": { "title": "238", "intro": [] },
|
"wyxz": { "title": "238", "intro": [] },
|
||||||
"dtfv": { "title": "239", "intro": [] },
|
"dtfv": { "title": "239", "intro": [] },
|
||||||
"miza": { "title": "240", "intro": [] },
|
"lab-quicksort-algorithm": {
|
||||||
|
"title": "Build the Quicksort Algorithm",
|
||||||
|
"intro": [
|
||||||
|
"For this lab, you will implement the Quicksort algorithm using JavaScript."
|
||||||
|
]
|
||||||
|
},
|
||||||
"manv": { "title": "241", "intro": [] },
|
"manv": { "title": "241", "intro": [] },
|
||||||
"bnvw": { "title": "242", "intro": [] },
|
"bnvw": { "title": "242", "intro": [] },
|
||||||
"xkhk": { "title": "243", "intro": [] },
|
"xkhk": { "title": "243", "intro": [] },
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
---
|
||||||
|
title: Introduction to the Build the Quicksort Algorithm
|
||||||
|
block: lab-quicksort-algorithm
|
||||||
|
superBlock: front-end-development
|
||||||
|
---
|
||||||
|
|
||||||
|
## Introduction to the Build the Quicksort Algorithm
|
||||||
|
|
||||||
|
For this lab, you will implement the Quicksort algorithm using JavaScript.
|
|
@ -0,0 +1,11 @@
|
||||||
|
{
|
||||||
|
"name": "Build the Quicksort Algorithm",
|
||||||
|
"isUpcomingChange": true,
|
||||||
|
"usesMultifileEditor": true,
|
||||||
|
"dashedName": "lab-quicksort-algorithm",
|
||||||
|
"order": 240,
|
||||||
|
"superBlock": "front-end-development",
|
||||||
|
"challengeOrder": [{ "id": "66d97c3be4030e8f41a92083", "title": "Build the Quicksort Algorithm" }],
|
||||||
|
"helpCategory": "JavaScript",
|
||||||
|
"blockType": "lab"
|
||||||
|
}
|
|
@ -0,0 +1,142 @@
|
||||||
|
---
|
||||||
|
id: 66d97c3be4030e8f41a92083
|
||||||
|
title: Build the Quicksort Algorithm
|
||||||
|
challengeType: 14
|
||||||
|
dashedName: build-the-quicksort-algorithm
|
||||||
|
---
|
||||||
|
|
||||||
|
# --description--
|
||||||
|
|
||||||
|
Quicksort is an algorithm that uses the divide and conquer approach to sort arrays.
|
||||||
|
|
||||||
|
It can be implemented as follows:
|
||||||
|
|
||||||
|
- Choose a pivot value among the elements of the input array (use the first or the last element of the array).
|
||||||
|
- Partition the input array into three subarrays containing elements greater than, lesser than, and equal to the pivot value.
|
||||||
|
- Recursively call `quicksort` to sort the subarrays.
|
||||||
|
|
||||||
|
**Objective:** Fulfill the user stories below and get all the tests to pass to complete the lab.
|
||||||
|
|
||||||
|
**User Stories:**
|
||||||
|
|
||||||
|
1. You should define a function named `quicksort` to implement the quicksort algorithm.
|
||||||
|
|
||||||
|
1. The `quicksort` function should take an array of integers as input and return an array of these integers in sorted order from least to greatest.
|
||||||
|
|
||||||
|
# --hints--
|
||||||
|
|
||||||
|
`quicksort` should be a function.
|
||||||
|
|
||||||
|
```js
|
||||||
|
assert.isFunction(quicksort);
|
||||||
|
```
|
||||||
|
|
||||||
|
`quicksort` should return a sorted array (least to greatest).
|
||||||
|
|
||||||
|
```js
|
||||||
|
function isSorted(a){
|
||||||
|
for(let i = 0; i < a.length - 1; i++)
|
||||||
|
if(a[i] > a[i + 1])
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(
|
||||||
|
isSorted(
|
||||||
|
quicksort([
|
||||||
|
1,
|
||||||
|
4,
|
||||||
|
2,
|
||||||
|
8,
|
||||||
|
345,
|
||||||
|
123,
|
||||||
|
43,
|
||||||
|
32,
|
||||||
|
5643,
|
||||||
|
63,
|
||||||
|
123,
|
||||||
|
43,
|
||||||
|
2,
|
||||||
|
55,
|
||||||
|
1,
|
||||||
|
234,
|
||||||
|
92
|
||||||
|
])
|
||||||
|
)
|
||||||
|
);
|
||||||
|
```
|
||||||
|
|
||||||
|
`quicksort([1,4,2,8,345,123,43,32,5643,63,123,43,2,55,1,234,92])` should return an array that is unchanged except for order.
|
||||||
|
|
||||||
|
```js
|
||||||
|
assert.sameMembers(
|
||||||
|
quicksort([
|
||||||
|
1,
|
||||||
|
4,
|
||||||
|
2,
|
||||||
|
8,
|
||||||
|
345,
|
||||||
|
123,
|
||||||
|
43,
|
||||||
|
32,
|
||||||
|
5643,
|
||||||
|
63,
|
||||||
|
123,
|
||||||
|
43,
|
||||||
|
2,
|
||||||
|
55,
|
||||||
|
1,
|
||||||
|
234,
|
||||||
|
92
|
||||||
|
]),
|
||||||
|
[1, 4, 2, 8, 345, 123, 43, 32, 5643, 63, 123, 43, 2, 55, 1, 234, 92]
|
||||||
|
);
|
||||||
|
```
|
||||||
|
|
||||||
|
`quicksort` should not use the built-in `.sort()` method.
|
||||||
|
|
||||||
|
```js
|
||||||
|
function isBuiltInSortUsed(){
|
||||||
|
let sortUsed = false;
|
||||||
|
const temp = Array.prototype.sort;
|
||||||
|
Array.prototype.sort = () => sortUsed = true;
|
||||||
|
quicksort([0, 1]);
|
||||||
|
Array.prototype.sort = temp;
|
||||||
|
return !sortUsed;
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(isBuiltInSortUsed());
|
||||||
|
```
|
||||||
|
|
||||||
|
# --seed--
|
||||||
|
|
||||||
|
## --seed-contents--
|
||||||
|
|
||||||
|
```js
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
# --solutions--
|
||||||
|
|
||||||
|
```js
|
||||||
|
const quicksort = (array) => {
|
||||||
|
if (array.length === 0) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
const pivot = array[0];
|
||||||
|
let lesser = [];
|
||||||
|
let equal = [];
|
||||||
|
let greater = [];
|
||||||
|
for (let i of array) {
|
||||||
|
if (i < pivot) {
|
||||||
|
lesser.push(i);
|
||||||
|
} else if (i > pivot) {
|
||||||
|
greater.push(i);
|
||||||
|
} else {
|
||||||
|
equal.push(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return [...quicksort(lesser), ...equal, ...quicksort(greater)];
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
Loading…
Reference in New Issue