Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
S
SortingAlgos
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
viktor.velitchk
SortingAlgos
Commits
07608bcb
Commit
07608bcb
authored
1 year ago
by
viktor.velitchk
Browse files
Options
Downloads
Patches
Plain Diff
Upload New File
parents
No related branches found
No related tags found
No related merge requests found
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
sort.ipynb
+327
-0
327 additions, 0 deletions
sort.ipynb
with
327 additions
and
0 deletions
sort.ipynb
0 → 100644
+
327
−
0
View file @
07608bcb
{
"cells": [
{
"cell_type": "markdown",
"source": [
"# Radix sort (Tri par base)\n",
"\n",
"N'utilise pas la notion de comparaison, mais celle de classements successif dans des catégories (alvéoles)\n",
"\n",
"- Tri de nombre entiers dans un tableau.\n",
"- On considère que des nombres >= 0 (sans perte de généralité)\n",
"- On considère ensuite la représentation binaire de ces nombres\n",
"\n",
"1. On considère le bit le moins significatif.\n",
"2. On parcourt une 1ʳᵉ fois le tableau et on place à la suite dans un 2ᵉ tableau les éléments dont le bit est 0;\n",
"puis on répète l'opération 2 pour les éléments dont le bit est 1.\n",
"3. On répète l'étape 2 en regardant le bit suivant et en permutant le rôle des deux tableaux.\n",
"\n",
"On utilise donc deux tableaux pour réaliser ce tri. À noter qu'à chaque étape, l'ordre des éléments dont le bit est à 0\n",
"(réspectivement à 1) reste identique dans le 2ᵉ tableau par rapport au 1er tableau."
],
"metadata": {
"collapsed": false
},
"id": "4932c4cb8c3d602c"
},
{
"cell_type": "code",
"execution_count": 43,
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Radix Sort\n",
"[5, -5, 1, 6, 4, -6, 2, -9, 2]\n",
"[-9, 1, -6, 2, 2, -5, 4, 5, 6]\n",
"Is it sorted [Y/N] : Y\n"
]
}
],
"source": [
"import math\n",
"\n",
"\n",
"def offset_arr(arr: list, offset: int):\n",
" for i, _ in enumerate(arr):\n",
" arr[i] += offset\n",
"\n",
"def bit_is_one_at(v: int, n: int) -> bool:\n",
" return v >> n & 1 == 1\n",
"\n",
"def alveole_0(arr1: list[int], arr2: list[int], position: int):\n",
" cnt = 0\n",
" for arr_element in arr1:\n",
" if not bit_is_one_at(arr_element, position):\n",
" arr2[cnt] = arr_element\n",
" cnt += 1\n",
" \n",
"def alveole_1(arr1: list[int], arr2: list[int], position: int):\n",
" cnt = len(arr1) - 1\n",
" for arr_element in reversed(arr1):\n",
" if bit_is_one_at(arr_element, position):\n",
" arr2[cnt] = arr_element\n",
" cnt -= 1\n",
"\n",
"def radix_sort(tab: list[int]) -> list[int]:\n",
" min_value = min(tab)\n",
" max_bit_count = len(bin(max(a))[2:])\n",
" offset_arr(tab, -min_value)\n",
" b = [0] * len(tab)\n",
" for i in range(max_bit_count):\n",
" alveole_0(tab, b, i)\n",
" alveole_1(tab, b, i)\n",
" tab = b.copy()\n",
" offset_arr(tab, min_value)\n",
" return tab\n",
"\n",
"a = [5, -5, 1, 6, 4, -6, 2, -9, 2]\n",
"\n",
"print('Radix Sort')\n",
"print(a)\n",
"print(radix_sort(a))\n",
"print('Is it sorted [Y/N] : ' + ('Y' if sorted(a) == radix_sort(a) else 'N'))\n"
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2023-11-13T17:41:43.410206857Z",
"start_time": "2023-11-13T17:41:43.369594646Z"
}
},
"id": "8fbaa3cc2dd052c5"
},
{
"cell_type": "markdown",
"source": [
"Merge sort (Tri par fusion)\n",
"\n",
"- Tri par comparaison.\n",
"- Idée: deux listes triées, sont fusionnées pour donner une liste triée plus longue.\n",
"- Itérativement, on trie d'abord les paires de nombres, puis les groupes de 4 nombres, ensuite 8,\n",
"et ainsi jusqu'à obtenir un tableau trié.\n"
],
"metadata": {
"collapsed": false
},
"id": "aad7933d9815e1c0"
},
{
"cell_type": "code",
"execution_count": 44,
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Merge sort\n",
"[5, -5, 1, 6, 4, -6, 2, -9, 2]\n",
"[-9, -6, -5, 1, 2, 2, 4, 5, 6]\n",
"Is it sorted [Y/N] : Y\n"
]
}
],
"source": [
"def merge_sort(tab: list[int]) -> list[int]:\n",
" if len(tab) > 1:\n",
" center = len(tab) // 2\n",
" \n",
" left = merge_sort(tab[:center])\n",
" left_size = len(left)\n",
" l_index = 0\n",
" \n",
" right = merge_sort(tab[center:])\n",
" right_size = len(right)\n",
" r_index = 0\n",
" \n",
" for i in range(len(tab)):\n",
" if l_index < left_size and r_index < right_size:\n",
" if left[l_index] < right[r_index]:\n",
" tab[i] = left[l_index]\n",
" l_index += 1\n",
" else:\n",
" tab[i] = right[r_index]\n",
" r_index += 1\n",
" elif l_index < left_size:\n",
" tab[i] = left[l_index]\n",
" l_index += 1\n",
" else:\n",
" tab[i] = right[r_index]\n",
" r_index += 1\n",
" return tab\n",
" else:\n",
" return tab\n",
" \n",
"\n",
"a = [5, -5, 1, 6, 4, -6, 2, -9, 2]\n",
"\n",
"print('Merge sort')\n",
"print(a)\n",
"print(merge_sort(a))\n",
"print('Is it sorted [Y/N] : ' + ('Y' if sorted(a) == merge_sort(a) else 'N'))\n"
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2023-11-13T17:41:43.410393544Z",
"start_time": "2023-11-13T17:41:43.409899965Z"
}
},
"id": "c763f02616f30e9e"
},
{
"cell_type": "markdown",
"source": [
"# Quicksort (Tri rapide)\n",
"\n",
"1. Choisir le pivot et l'amener à sa place.\n",
" - Les éléments à gauche sont plus petits que le pivot.\n",
" - Les éléments à droite sont plus grands que le pivot.\n",
"2. quicksort(tableau_gauche) en omettant le pivot.\n",
"3. quicksort(tableau_droite) en omettant le pivot.\n",
"4. S'il y a moins de deux éléments dans le tableau, le tableau est trié.\n"
],
"metadata": {
"collapsed": false
},
"id": "3b774e6e3d0a248a"
},
{
"cell_type": "code",
"execution_count": 45,
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"Quick sort\n",
"[5, -5, 1, 6, 4, -6, 2, -9, 2]\n",
"[-9, -6, 1, -5, 2, 2, 4, 5, 6]\n",
"Is it sorted [Y/N] : Y\n"
]
}
],
"source": [
"def quicksort(tab: list[int]) -> list[int]:\n",
" pivot = tab[-1]\n",
" i = 0\n",
" j = len(tab) - 2\n",
" while i < j:\n",
" if tab[i] < pivot:\n",
" i += 1\n",
" if i == j:\n",
" i += 1\n",
" break\n",
" if tab[j] > pivot:\n",
" j -= 1\n",
" tab[i], tab[j] = tab[j], tab[i]\n",
" tab[i], tab[-1] = tab[-1], tab[i]\n",
" left = tab[:i]\n",
" right = tab[i+1:]\n",
" if len(left) > 2:\n",
" for k, v in enumerate(quicksort(left)):\n",
" tab[k] = v\n",
" if len(right) > 2:\n",
" for k, v in enumerate(quicksort(right)):\n",
" tab[k + i + 1] = v\n",
" return tab\n",
"\n",
"a = [5, -5, 1, 6, 4, -6, 2, -9, 2]\n",
"\n",
"print('\\nQuick sort')\n",
"print(a)\n",
"print(quicksort(a))\n",
"print('Is it sorted [Y/N] : ' + ('Y' if sorted(a) == quicksort(a) else 'N'))\n"
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2023-11-13T17:41:43.410715027Z",
"start_time": "2023-11-13T17:41:43.410096141Z"
}
},
"id": "f8c901505242e16"
},
{
"cell_type": "markdown",
"source": [
"Bubble sort (Tri à bulle)\n",
"- Parcours du tableau et comparaison des éléments consécutifs :\n",
" - Si deux éléments consécutifs ne sont pas dans l’ordre, ils sont échangés.\n",
"- On recommence depuis le début du tableau jusqu’à avoir plus d’échanges à faire.\n"
],
"metadata": {
"collapsed": false
},
"id": "fbedcc81da34606a"
},
{
"cell_type": "code",
"execution_count": 46,
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"Bubble sort\n",
"[5, -5, 1, 6, 4, -6, 2, -9, 2]\n",
"[-9, -6, -5, 1, 2, 2, 4, 5, 6]\n",
"Is it sorted [Y/N] : Y\n"
]
}
],
"source": [
"def bubble_sort(arr: list[int]) -> list[int]:\n",
" for i in range(len(arr) - 1, 1, -1):\n",
" already_sorted = True\n",
" for j in range(i):\n",
" if arr[j] > arr[j+1]:\n",
" arr[j], arr[j+1] = arr[j+1], arr[j]\n",
" already_sorted = False\n",
" if already_sorted:\n",
" return arr\n",
" return arr\n",
"\n",
"\n",
"a = [5, -5, 1, 6, 4, -6, 2, -9, 2]\n",
"\n",
"print('\\nBubble sort')\n",
"print(a)\n",
"print(bubble_sort(a))\n",
"print('Is it sorted [Y/N] : ' + ('Y' if sorted(a) == bubble_sort(a) else 'N'))\n"
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2023-11-13T17:41:43.410820189Z",
"start_time": "2023-11-13T17:41:43.410150694Z"
}
},
"id": "d8619d37c9c0b1c2"
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.6"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
%% Cell type:markdown id:4932c4cb8c3d602c tags:
# Radix sort (Tri par base)
N'utilise pas la notion de comparaison, mais celle de classements successif dans des catégories (alvéoles)
-
Tri de nombre entiers dans un tableau.
-
On considère que des nombres >= 0 (sans perte de généralité)
-
On considère ensuite la représentation binaire de ces nombres
1.
On considère le bit le moins significatif.
2.
On parcourt une 1ʳᵉ fois le tableau et on place à la suite dans un 2ᵉ tableau les éléments dont le bit est 0;
puis on répète l'opération 2 pour les éléments dont le bit est 1.
3.
On répète l'étape 2 en regardant le bit suivant et en permutant le rôle des deux tableaux.
On utilise donc deux tableaux pour réaliser ce tri. À noter qu'à chaque étape, l'ordre des éléments dont le bit est à 0
(réspectivement à 1) reste identique dans le 2ᵉ tableau par rapport au 1er tableau.
%% Cell type:code id:8fbaa3cc2dd052c5 tags:
```
python
import
math
def
offset_arr
(
arr
:
list
,
offset
:
int
):
for
i
,
_
in
enumerate
(
arr
):
arr
[
i
]
+=
offset
def
bit_is_one_at
(
v
:
int
,
n
:
int
)
->
bool
:
return
v
>>
n
&
1
==
1
def
alveole_0
(
arr1
:
list
[
int
],
arr2
:
list
[
int
],
position
:
int
):
cnt
=
0
for
arr_element
in
arr1
:
if
not
bit_is_one_at
(
arr_element
,
position
):
arr2
[
cnt
]
=
arr_element
cnt
+=
1
def
alveole_1
(
arr1
:
list
[
int
],
arr2
:
list
[
int
],
position
:
int
):
cnt
=
len
(
arr1
)
-
1
for
arr_element
in
reversed
(
arr1
):
if
bit_is_one_at
(
arr_element
,
position
):
arr2
[
cnt
]
=
arr_element
cnt
-=
1
def
radix_sort
(
tab
:
list
[
int
])
->
list
[
int
]:
min_value
=
min
(
tab
)
max_bit_count
=
len
(
bin
(
max
(
a
))[
2
:])
offset_arr
(
tab
,
-
min_value
)
b
=
[
0
]
*
len
(
tab
)
for
i
in
range
(
max_bit_count
):
alveole_0
(
tab
,
b
,
i
)
alveole_1
(
tab
,
b
,
i
)
tab
=
b
.
copy
()
offset_arr
(
tab
,
min_value
)
return
tab
a
=
[
5
,
-
5
,
1
,
6
,
4
,
-
6
,
2
,
-
9
,
2
]
print
(
'
Radix Sort
'
)
print
(
a
)
print
(
radix_sort
(
a
))
print
(
'
Is it sorted [Y/N] :
'
+
(
'
Y
'
if
sorted
(
a
)
==
radix_sort
(
a
)
else
'
N
'
))
```
%% Output
Radix Sort
[5, -5, 1, 6, 4, -6, 2, -9, 2]
[-9, 1, -6, 2, 2, -5, 4, 5, 6]
Is it sorted [Y/N] : Y
%% Cell type:markdown id:aad7933d9815e1c0 tags:
Merge sort (Tri par fusion)
-
Tri par comparaison.
-
Idée: deux listes triées, sont fusionnées pour donner une liste triée plus longue.
-
Itérativement, on trie d'abord les paires de nombres, puis les groupes de 4 nombres, ensuite 8,
et ainsi jusqu'à obtenir un tableau trié.
%% Cell type:code id:c763f02616f30e9e tags:
```
python
def
merge_sort
(
tab
:
list
[
int
])
->
list
[
int
]:
if
len
(
tab
)
>
1
:
center
=
len
(
tab
)
//
2
left
=
merge_sort
(
tab
[:
center
])
left_size
=
len
(
left
)
l_index
=
0
right
=
merge_sort
(
tab
[
center
:])
right_size
=
len
(
right
)
r_index
=
0
for
i
in
range
(
len
(
tab
)):
if
l_index
<
left_size
and
r_index
<
right_size
:
if
left
[
l_index
]
<
right
[
r_index
]:
tab
[
i
]
=
left
[
l_index
]
l_index
+=
1
else
:
tab
[
i
]
=
right
[
r_index
]
r_index
+=
1
elif
l_index
<
left_size
:
tab
[
i
]
=
left
[
l_index
]
l_index
+=
1
else
:
tab
[
i
]
=
right
[
r_index
]
r_index
+=
1
return
tab
else
:
return
tab
a
=
[
5
,
-
5
,
1
,
6
,
4
,
-
6
,
2
,
-
9
,
2
]
print
(
'
Merge sort
'
)
print
(
a
)
print
(
merge_sort
(
a
))
print
(
'
Is it sorted [Y/N] :
'
+
(
'
Y
'
if
sorted
(
a
)
==
merge_sort
(
a
)
else
'
N
'
))
```
%% Output
Merge sort
[5, -5, 1, 6, 4, -6, 2, -9, 2]
[-9, -6, -5, 1, 2, 2, 4, 5, 6]
Is it sorted [Y/N] : Y
%% Cell type:markdown id:3b774e6e3d0a248a tags:
# Quicksort (Tri rapide)
1.
Choisir le pivot et l'amener à sa place.
-
Les éléments à gauche sont plus petits que le pivot.
-
Les éléments à droite sont plus grands que le pivot.
2.
quicksort(tableau_gauche) en omettant le pivot.
3.
quicksort(tableau_droite) en omettant le pivot.
4.
S'il y a moins de deux éléments dans le tableau, le tableau est trié.
%% Cell type:code id:f8c901505242e16 tags:
```
python
def
quicksort
(
tab
:
list
[
int
])
->
list
[
int
]:
pivot
=
tab
[
-
1
]
i
=
0
j
=
len
(
tab
)
-
2
while
i
<
j
:
if
tab
[
i
]
<
pivot
:
i
+=
1
if
i
==
j
:
i
+=
1
break
if
tab
[
j
]
>
pivot
:
j
-=
1
tab
[
i
],
tab
[
j
]
=
tab
[
j
],
tab
[
i
]
tab
[
i
],
tab
[
-
1
]
=
tab
[
-
1
],
tab
[
i
]
left
=
tab
[:
i
]
right
=
tab
[
i
+
1
:]
if
len
(
left
)
>
2
:
for
k
,
v
in
enumerate
(
quicksort
(
left
)):
tab
[
k
]
=
v
if
len
(
right
)
>
2
:
for
k
,
v
in
enumerate
(
quicksort
(
right
)):
tab
[
k
+
i
+
1
]
=
v
return
tab
a
=
[
5
,
-
5
,
1
,
6
,
4
,
-
6
,
2
,
-
9
,
2
]
print
(
'
\n
Quick sort
'
)
print
(
a
)
print
(
quicksort
(
a
))
print
(
'
Is it sorted [Y/N] :
'
+
(
'
Y
'
if
sorted
(
a
)
==
quicksort
(
a
)
else
'
N
'
))
```
%% Output
Quick sort
[5, -5, 1, 6, 4, -6, 2, -9, 2]
[-9, -6, 1, -5, 2, 2, 4, 5, 6]
Is it sorted [Y/N] : Y
%% Cell type:markdown id:fbedcc81da34606a tags:
Bubble sort (Tri à bulle)
-
Parcours du tableau et comparaison des éléments consécutifs :
-
Si deux éléments consécutifs ne sont pas dans l’ordre, ils sont échangés.
-
On recommence depuis le début du tableau jusqu’à avoir plus d’échanges à faire.
%% Cell type:code id:d8619d37c9c0b1c2 tags:
```
python
def
bubble_sort
(
arr
:
list
[
int
])
->
list
[
int
]:
for
i
in
range
(
len
(
arr
)
-
1
,
1
,
-
1
):
already_sorted
=
True
for
j
in
range
(
i
):
if
arr
[
j
]
>
arr
[
j
+
1
]:
arr
[
j
],
arr
[
j
+
1
]
=
arr
[
j
+
1
],
arr
[
j
]
already_sorted
=
False
if
already_sorted
:
return
arr
return
arr
a
=
[
5
,
-
5
,
1
,
6
,
4
,
-
6
,
2
,
-
9
,
2
]
print
(
'
\n
Bubble sort
'
)
print
(
a
)
print
(
bubble_sort
(
a
))
print
(
'
Is it sorted [Y/N] :
'
+
(
'
Y
'
if
sorted
(
a
)
==
bubble_sort
(
a
)
else
'
N
'
))
```
%% Output
Bubble sort
[5, -5, 1, 6, 4, -6, 2, -9, 2]
[-9, -6, -5, 1, 2, 2, 4, 5, 6]
Is it sorted [Y/N] : Y
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment