From 6492125dfb73941e72fdfe5f5f83ce3c265c04ba Mon Sep 17 00:00:00 2001 From: MKruchok <74894852+MKruchok@users.noreply.github.com> Date: Wed, 15 Sep 2021 01:44:52 +0300 Subject: [PATCH 1/4] Added lab1 files --- README.md | 21 +++++++++++++++++++-- quick_sort.py | 38 ++++++++++++++++++++++++++++++++++++++ tests.py | 26 ++++++++++++++++++++++++++ 3 files changed, 83 insertions(+), 2 deletions(-) create mode 100644 quick_sort.py create mode 100644 tests.py diff --git a/README.md b/README.md index 84b53db..91ecc46 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,19 @@ -# Algorithms - +# Lab_1 +### Task +Implement a sorting algorithm - QuickSort(ascending/descending) + + ### Result output + + Algorithm's name + + Execution time + + Counters: swaps, comparisons + + Sorting result + + ### Code must be covered with tests + + sort the input array + + sort in ascending order of sorted array in ascending order + + sort in descending order of sorted array in ascending order + + sort in ascending order of sorted array in descending order + + sort in descending order of sorted array in descending order + + ### How to run + + run command `python3 -m unittest tests.py` while in project folder \ No newline at end of file diff --git a/quick_sort.py b/quick_sort.py new file mode 100644 index 0000000..19eab26 --- /dev/null +++ b/quick_sort.py @@ -0,0 +1,38 @@ +def partition(array, low, high): + i = (low - 1) + pivot = array[high] + + for j in range(low, high): + + if order: + if array[j] <= pivot: + + i = i + 1 + array[i], array[j] = array[j], array[i] + if not order: + if array[j] >= pivot: + + i = i + 1 + array[i], array[j] = array[j], array[i] + + array[i + 1], array[high] = array[high], array[i + 1] + return i + 1 + + +def quickSort(array, low, high): + if len(array) == 1: + return array + if low < high: + pi = partition(array, low, high) + + quickSort(array, low, pi - 1) + quickSort(array, pi + 1, high) + + +arr = [10, 29, 63, 33, 85, 1, 8, 5] +n = len(arr) +order = False +quickSort(arr, 0, n - 1) +print("Sorted array is:") +for k in range(n): + print(arr[k]) diff --git a/tests.py b/tests.py new file mode 100644 index 0000000..10f3b80 --- /dev/null +++ b/tests.py @@ -0,0 +1,26 @@ +from quick_sort import quickSort +import unittest + + +class TestQuickSort(unittest.TestCase): + def test_asc(self): + self.assertEqual(quickSort([1, 0, 4, 6, 6, 1]), [0, 1, 1, 4, 6, 6]) + + def test_desc(self): + self.assertEqual(quickSort([1, 0, 4, 6, 6, 1], False), [6, 6, 4, 1, 1, 0]) + + def test_asc_asc(self): + self.assertEqual(quickSort([0, 1, 1, 4, 6, 6]), [0, 1, 1, 4, 6, 6]) + + def test_desc_asc(self): + self.assertEqual(quickSort([6, 6, 4, 1, 1, 0]), [0, 1, 1, 4, 6, 6]) + + def test_asc_desc(self): + self.assertEqual(quickSort([0, 1, 1, 4, 6, 6], False), [6, 6, 4, 1, 1, 0]) + + def test_desc_desc(self): + self.assertEqual(quickSort([6, 6, 4, 1, 1, 0], False), [6, 6, 4, 1, 1, 0]) + + +if __name__ == '__main__': + unittest.main() From 1da89f6df27ffd0d07f37ca9d6653ef694cee139 Mon Sep 17 00:00:00 2001 From: MKruchok <74894852+MKruchok@users.noreply.github.com> Date: Wed, 15 Sep 2021 17:55:07 +0300 Subject: [PATCH 2/4] Added more features, updated README.md --- README.md | 6 ++++- quick_sort.py | 71 +++++++++++++++++++++++++++++++++++---------------- tests.py | 33 ++++++++++++++++-------- 3 files changed, 76 insertions(+), 34 deletions(-) diff --git a/README.md b/README.md index 91ecc46..d93b9a6 100644 --- a/README.md +++ b/README.md @@ -16,4 +16,8 @@ Implement a sorting algorithm - QuickSort(ascending/descending) + sort in descending order of sorted array in descending order ### How to run - + run command `python3 -m unittest tests.py` while in project folder \ No newline at end of file + + Clone repository: `git clone https://github.com/MKruchok/Algorithms.git` + + Choose lab_1 branch: `git checkout lab_1` + + Get into folder: `cd Algorithms` + + Run `py quick_sort.py -a -o ` + \ No newline at end of file diff --git a/quick_sort.py b/quick_sort.py index 19eab26..a7326d3 100644 --- a/quick_sort.py +++ b/quick_sort.py @@ -1,38 +1,65 @@ -def partition(array, low, high): - i = (low - 1) - pivot = array[high] +import datetime +import getopt +import sys +from enum import Enum - for j in range(low, high): - if order: - if array[j] <= pivot: +class SortOrder(Enum): + ASC = 1 + DESC = 2 - i = i + 1 - array[i], array[j] = array[j], array[i] - if not order: - if array[j] >= pivot: - i = i + 1 - array[i], array[j] = array[j], array[i] +def partition(array, low, high, ascending: bool = True): + global swaps, comparisons + i = (low - 1) + pivot = array[high] + + for j in range(low, high): + comparisons += 1 + if array[j] <= pivot and ascending or array[j] >= pivot and not ascending: + i = i + 1 + swaps += 1 + array[i], array[j] = array[j], array[i] array[i + 1], array[high] = array[high], array[i + 1] return i + 1 -def quickSort(array, low, high): +def quickSort(array, low, high, ascending: bool = True): if len(array) == 1: return array if low < high: - pi = partition(array, low, high) + pi = partition(array, low, high, ascending) + + quickSort(array, low, pi - 1, ascending) + quickSort(array, pi + 1, high, ascending) + return array + - quickSort(array, low, pi - 1) - quickSort(array, pi + 1, high) +def main(argv): + _arr, _ascending = [], True + opts, args = getopt.getopt(argv, "ha:o:", ["array=", "order="]) + for opt, arg in opts: + if opt in ("-a", "--array"): + _arr = [int(i) for i in arg.split(',') if i] + if opt in ("-o", "--order"): + if arg in ('asc', 'desc'): + if arg == 'asc': + _ascending = True + else: + _ascending = False + return _arr, _ascending -arr = [10, 29, 63, 33, 85, 1, 8, 5] +comparisons = 0 +swaps = 0 +arr, ascending = main(sys.argv[1:]) n = len(arr) -order = False -quickSort(arr, 0, n - 1) -print("Sorted array is:") -for k in range(n): - print(arr[k]) +start = datetime.datetime.now() +sorted_arr = quickSort(arr, 0, n - 1, ascending) +execution_time = datetime.datetime.now() - start +print("QuickSort:\n" + f"Execution time: {execution_time.total_seconds() * 1000} ms\n" + f"Comparisons: {comparisons}\n" + f"Swaps: {swaps}\n" + f"{sorted_arr}") diff --git a/tests.py b/tests.py index 10f3b80..ca02c13 100644 --- a/tests.py +++ b/tests.py @@ -3,23 +3,34 @@ class TestQuickSort(unittest.TestCase): - def test_asc(self): - self.assertEqual(quickSort([1, 0, 4, 6, 6, 1]), [0, 1, 1, 4, 6, 6]) - - def test_desc(self): - self.assertEqual(quickSort([1, 0, 4, 6, 6, 1], False), [6, 6, 4, 1, 1, 0]) + def test_input_array(self): + arr = [10, 29, 63, 33, 85, 1, 8, 5] + n = len(arr) + self.assertEqual(quickSort(arr, 0, n-1), sorted(arr)) def test_asc_asc(self): - self.assertEqual(quickSort([0, 1, 1, 4, 6, 6]), [0, 1, 1, 4, 6, 6]) - - def test_desc_asc(self): - self.assertEqual(quickSort([6, 6, 4, 1, 1, 0]), [0, 1, 1, 4, 6, 6]) + asc_arr = [i for i in range(100)] + n = len(asc_arr) + quickSort(asc_arr, 0, n-1) + self.assertEqual(quickSort(asc_arr, 0, n-1), sorted(asc_arr)) def test_asc_desc(self): - self.assertEqual(quickSort([0, 1, 1, 4, 6, 6], False), [6, 6, 4, 1, 1, 0]) + asc_arr = [i for i in range(100)] + n = len(asc_arr) + quickSort(asc_arr, 0, n-1, False) + self.assertEqual(quickSort(asc_arr, 0, n-1, False), sorted(asc_arr, reverse=True)) def test_desc_desc(self): - self.assertEqual(quickSort([6, 6, 4, 1, 1, 0], False), [6, 6, 4, 1, 1, 0]) + asc_arr = [i for i in range(100, 0, -1)] + n = len(asc_arr) + quickSort(asc_arr, 0, n-1, False) + self.assertEqual(quickSort(asc_arr, 0, n-1, False), sorted(asc_arr, reverse=True)) + + def test_desc_asc(self): + asc_arr = [i for i in range(100, 0, -1)] + n = len(asc_arr) + quickSort(asc_arr, 0, n-1) + self.assertEqual(quickSort(asc_arr, 0, n-1), sorted(asc_arr)) if __name__ == '__main__': From c786fd5df21e87bb296e859a7c49a79b10c64605 Mon Sep 17 00:00:00 2001 From: Phlake Date: Fri, 3 Jun 2022 10:31:41 +0300 Subject: [PATCH 3/4] minor changes --- .gitignore | 522 +++++++++++++++++++++++++++++++++++++++++--------- quick_sort.py | 20 +- 2 files changed, 437 insertions(+), 105 deletions(-) diff --git a/.gitignore b/.gitignore index 510c73d..b02d695 100644 --- a/.gitignore +++ b/.gitignore @@ -1,114 +1,446 @@ -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates -# C extensions -*.so +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs -# Distribution / packaging -.Python +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -*.egg-info/ -.installed.cfg -*.egg -MANIFEST - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.nox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*.cover -.hypothesis/ -.pytest_cache/ - -# Translations -*.mo -*.pot - -# Django stuff: +bld/ +[Bb]in/ +[Oo]bj/ +out/ + +# Visual Studio 2015 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ +**/Properties/launchSettings.json +# DNX +project.lock.json +artifacts/ + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj *.log -local_settings.py -db.sqlite3 +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb +*.opensdf +*.sdf +*.cachefile + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html -# Flask stuff: -instance/ -.webassets-cache +# Click-Once directory +# publish/ -# Scrapy stuff: -.scrapy +# Publish Web Output +*.azurePubxml +# TODO: Comment the next line if you want to checkin your web deploy settings +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj -# Sphinx documentation -docs/_build/ +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config -# PyBuilder -target/ +# Windows Azure Build Output +csx/ +*.build.csdef -# Jupyter Notebook -.ipynb_checkpoints +# Windows Store app package directory +AppPackages/ -# IPython -profile_default/ -ipython_config.py +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ -# pyenv -.python-version +# Others +ClientBin/ +[Ss]tyle[Cc]op.* +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs -# celery beat schedule file -celerybeat-schedule +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ -# SageMath parsed files -*.sage.py +*.pfx +*.publishsettings +node_modules/ +orleans.codegen.cs -# Environments -.env -.venv -env/ -venv/ -ENV/ -env.bak/ -venv.bak/ +# RIA/Silverlight projects +Generated_Code/ -# Spyder project settings -.spyderproject -.spyproject +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm -# Rope project settings -.ropeproject +# SQL Server files +*.mdf +*.ldf +*.ndf -# mkdocs documentation -/site +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Typescript v1 declaration files +typings/ +# Node.js Tools for Visual Studio +.ntvs_analysis.dat + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# CodeRush +.cr/ + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +/build +/Build +/deploy +/package +bin/ +obj/ +sql/ +*/obj/debug +**/Debug +#ignore thumbnails created by windows +Thumbs.db +#Ignore files build by Visual Studio +*.obj +*.pdb +*.user +*.aps +*.pch +*.docstates +*.vspscc +*_i.c +*_p.c +*.ncb +*.suo +*.tlb +*.dbmdl +*.schemaview +*.tlh +*.cache +*.ilk +*.log +[Bb]in +[Dd]ebug*/ +*.lib +*.sbr +obj/ +[Rr]elease*/ +_ReSharper*/ +[Tt]est[Rr]esult* +*.docstates +*.swp +*.*~ +*.gpState +*.ReSharper* +*.preflight +*.nocommit +#Ignore Recovery Files made by Excel +~$*.xlsx +*.rdl.data + +*.jfm + +#====================================================================================== +# The below section could possibly be removed as these should be ignored by the above. +#====================================================================================== + +samples/in-memory/ticket-reservations/DemoWorkload/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs +*.nupkg +samples/in-memory/ticket-reservations/packages/CircularGauge.1.0.0/CreatePackageFile.bat +*.suo +samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/bin/Debug/PopulateAlwaysEncryptedData.exe +*.pdb +samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/bin/Debug/PopulateAlwaysEncryptedData.vshost.exe +*.Cache +samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/bin/Debug/PopulateAlwaysEncryptedData.exe.config +samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs +samples/databases/wide-world-importers/workload-drivers/vehicle-location-insert/MultithreadedInMemoryTableInsert/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs +*.exe +samples/features/in-memory/iot-smart-grid/ConsoleClient/bin/Release/DataGenerator.dll +samples/features/in-memory/iot-smart-grid/ConsoleClient/bin/Release/Reports/PowerDashboard.pbix +samples/databases/wide-world-importers/wwi-integration-etl/Daily ETL/bin/Development/Daily ETL.ispac +samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/obj/Release/PopulateAlwaysEncryptedData.csproj.FileListAbsolute.txt +samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/bin/Release/PopulateAlwaysEncryptedData.vshost.exe.config +samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/obj/Release/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs +*.dll +samples/features/in-memory/ticket-reservations/DemoWorkload/obj/Release/DemoWorkload.FrmConfig.resources +samples/features/in-memory/ticket-reservations/DemoWorkload/bin/Release/DemoWorkload.vshost.exe.config +samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/obj/Debug/PopulateAlwaysEncryptedData.csproj.FileListAbsolute.txt +samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/bin/Debug/PopulateAlwaysEncryptedData.vshost.exe.config +*.zip +samples/features/in-memory/ticket-reservations/packages/CircularGauge.1.0.0/CreatePackageFile.bat +samples/features/in-memory/ticket-reservations/TicketReservations/TicketReservations.dbmdl +samples/databases/wide-world-importers/workload-drivers/vehicle-location-insert/MultithreadedInMemoryTableInsert/obj/Release/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs +samples/databases/wide-world-importers/workload-drivers/vehicle-location-insert/MultithreadedInMemoryTableInsert/obj/Debug/MultithreadedInMemoryTableInsert.csproj.FileListAbsolute.txt +samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/obj/Debug/PopulateAlwaysEncryptedData.Properties.Resources.resources +samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/obj/Release/PopulateAlwaysEncryptedData.PopulateAlwaysEncryptedDataMain.resources +samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/bin/Debug/PopulateAlwaysEncryptedData.vshost.exe.manifest +samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/obj/Debug/PopulateAlwaysEncryptedData.PopulateAlwaysEncryptedDataMain.resources +samples/databases/wide-world-importers/workload-drivers/vehicle-location-insert/MultithreadedInMemoryTableInsert/obj/Release/MultithreadedInMemoryTableInsert.Properties.Resources.resources +samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/obj/Release/PopulateAlwaysEncryptedData.Properties.Resources.resources +samples/features/in-memory/ticket-reservations/packages/CircularGauge.1.0.0/ReadMe.txt +*.dacpac +samples/features/in-memory/ticket-reservations/TicketReservations/obj/Release/Model.xml +samples/features/in-memory/ticket-reservations/DemoWorkload/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs +*.dat + +*.user +samples/features/in-memory/ticket-reservations/DemoWorkload/obj/Release/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs +samples/databases/wide-world-importers/workload-drivers/vehicle-location-insert/MultithreadedInMemoryTableInsert/obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs +samples/features/in-memory/ticket-reservations/DemoWorkload/bin/Debug/DemoWorkload.vshost.exe.config +samples/features/in-memory/ticket-reservations/DemoWorkload/obj/Release/DemoWorkload.Properties.Resources.resources +samples/databases/wide-world-importers/wwi-integration-etl/Daily ETL/obj/Development/Project.params +samples/features/in-memory/ticket-reservations/DemoWorkload/obj/Debug/DemoWorkload.csproj.FileListAbsolute.txt +samples/features/in-memory/iot-smart-grid/Db/obj/Release/Model.xml +samples/applications/iot-smart-grid/DataGenerator/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs +samples/databases/wide-world-importers/workload-drivers/order-insert/MultithreadedOrderInsert/bin/Debug/MultithreadedOrderInsert.exe.config +samples/features/in-memory/iot-smart-grid/ConsoleClient/bin/Release/ConsoleClient.exe.config +*.jfm +samples/features/in-memory/ticket-reservations/TicketReservations/bin/Release/TicketReservations.publish.sql +samples/applications/iot-smart-grid/ConsoleClient/bin/Release/ConsoleClient.exe.config +samples/applications/iot-smart-grid/Db/Db.dbmdl +samples/databases/wide-world-importers/workload-drivers/order-insert/MultithreadedOrderInsert/obj/Release/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs +samples/databases/wide-world-importers/wwi-dw-ssdt/wwi-dw-ssdt/obj/Debug/Model.xml +samples/databases/wide-world-importers/wwi-dw-ssdt/wwi-dw-ssdt/WideWorldImportersDW.dbmdl +samples/features/in-memory/iot-smart-grid/WinFormsClient/bin/Release/Reports/PowerDashboard.pbix +samples/databases/wide-world-importers/wwi-ssdt/wwi-ssdt/WideWorldImporters.dbmdl +samples/databases/wide-world-importers/workload-drivers/order-insert/MultithreadedOrderInsert/obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs +samples/databases/wide-world-importers/wwi-ssasmd/wwi-ssasmd/bin/WWI-SSASMD.asdatabase +samples/applications/iot-smart-grid/Db/obj/Release/Db.sqlproj.FileListAbsolute.txt +*.manifest +samples/applications/iot-smart-grid/WinFormsClient/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs +samples/databases/wide-world-importers/wwi-ssasmd/wwi-ssasmd/obj/Development/IncrementalShapshot.xml +samples/applications/iot-smart-grid/ConsoleClient/bin/Release/Reports/PowerDashboard.pbix +samples/applications/iot-smart-grid/Db/obj/Release/Model.xml +samples/databases/wide-world-importers/workload-drivers/order-insert/MultithreadedOrderInsert/obj/Release/MultithreadedOrderInsert.csproj.FileListAbsolute.txt +samples/applications/iot-smart-grid/ConsoleClient/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs +samples/applications/iot-smart-grid/WinFormsClient/bin/Release/Client.exe.config +samples/databases/wide-world-importers/workload-drivers/order-insert/MultithreadedOrderInsert/bin/Release/MultithreadedOrderInsert.exe.config +samples/databases/wide-world-importers/workload-drivers/order-insert/MultithreadedOrderInsert/obj/Debug/MultithreadedInMemoryTableInsert.MultithreadedOrderInsertMain.resources +/samples/features/epm-framework/5.0/2Reporting/PolicyReports/PolicyEvaluationErrors.rdl.data +/samples/features/epm-framework/5.0/2Reporting/PolicyReports/PolicyEvaluationErrorDetails.rdl.data +/samples/features/epm-framework/5.0/2Reporting/PolicyReports/PolicyEvaluationDetails.rdl.data +/samples/features/epm-framework/5.0/2Reporting/PolicyReports/PolicyDetails.rdl.data +/samples/features/epm-framework/5.0/2Reporting/PolicyReports/PolicyDashboard.rdl.data +/samples/features/epm-framework/5.0/2Reporting/PolicyReports/bin/Debug +/samples/features/epm-framework/5.0/2Reporting/PolicyReports/PolicyDashboard - Backup.rdl +/samples/features/epm-framework/5.0/2Reporting/PolicyReports/PolicyDashboardFiltered.rdl.data +samples/features/sql-management-objects/src/out/CodeCoverage/CodeCoverage.config -# mypy -.mypy_cache/ -.dmypy.json -dmypy.json +# Certificates +*.pem +*.p12 -# Pyre type checker -.pyre/ +# Composer +/vendor/ \ No newline at end of file diff --git a/quick_sort.py b/quick_sort.py index a7326d3..fd1c67c 100644 --- a/quick_sort.py +++ b/quick_sort.py @@ -9,30 +9,30 @@ class SortOrder(Enum): DESC = 2 -def partition(array, low, high, ascending: bool = True): +def partition(array, right, left, ascending: bool = True): global swaps, comparisons - i = (low - 1) - pivot = array[high] + i = (right - 1) + pivot = array[left] - for j in range(low, high): + for j in range(right, left): comparisons += 1 if array[j] <= pivot and ascending or array[j] >= pivot and not ascending: i = i + 1 swaps += 1 array[i], array[j] = array[j], array[i] - array[i + 1], array[high] = array[high], array[i + 1] + array[i + 1], array[left] = array[left], array[i + 1] return i + 1 -def quickSort(array, low, high, ascending: bool = True): +def quickSort(array, right, left, ascending: bool = True): if len(array) == 1: return array - if low < high: - pi = partition(array, low, high, ascending) + if right < left: + pi = partition(array, right, left, ascending) - quickSort(array, low, pi - 1, ascending) - quickSort(array, pi + 1, high, ascending) + quickSort(array, right, pi - 1, ascending) + quickSort(array, pi + 1, left, ascending) return array From 063f0e24a8e7e4fdfc094e142b0ce09bd73c1eff Mon Sep 17 00:00:00 2001 From: Phlake Date: Fri, 3 Jun 2022 16:00:27 +0300 Subject: [PATCH 4/4] minor changes --- quick_sort.py | 31 +++++++++++++++---------------- tests.py | 20 ++++++++++---------- 2 files changed, 25 insertions(+), 26 deletions(-) diff --git a/quick_sort.py b/quick_sort.py index fd1c67c..a4355c6 100644 --- a/quick_sort.py +++ b/quick_sort.py @@ -9,30 +9,29 @@ class SortOrder(Enum): DESC = 2 -def partition(array, right, left, ascending: bool = True): +def partition(array, left, right_and_pivot, ascending: bool = True): global swaps, comparisons - i = (right - 1) - pivot = array[left] + pivot_val = array[right_and_pivot] - for j in range(right, left): - comparisons += 1 - if array[j] <= pivot and ascending or array[j] >= pivot and not ascending: - i = i + 1 + for current in range(left, right_and_pivot): + if array[current] <= pivot_val and ascending or array[current] >= pivot_val and not ascending: + array[left], array[current] = array[current], array[left] + left += 1 swaps += 1 - array[i], array[j] = array[j], array[i] + comparisons += 1 - array[i + 1], array[left] = array[left], array[i + 1] - return i + 1 + array[left], array[right_and_pivot] = array[right_and_pivot], array[left] + return left -def quickSort(array, right, left, ascending: bool = True): +def quick_sort(array, left, right, ascending: bool = True): if len(array) == 1: return array - if right < left: - pi = partition(array, right, left, ascending) + if left < right: + pivot = partition(array, left, right, ascending) - quickSort(array, right, pi - 1, ascending) - quickSort(array, pi + 1, left, ascending) + quick_sort(array, left, pivot - 1, ascending) + quick_sort(array, pivot + 1, right, ascending) return array @@ -56,7 +55,7 @@ def main(argv): arr, ascending = main(sys.argv[1:]) n = len(arr) start = datetime.datetime.now() -sorted_arr = quickSort(arr, 0, n - 1, ascending) +sorted_arr = quick_sort(arr, 0, n - 1, ascending) execution_time = datetime.datetime.now() - start print("QuickSort:\n" f"Execution time: {execution_time.total_seconds() * 1000} ms\n" diff --git a/tests.py b/tests.py index ca02c13..41c68bd 100644 --- a/tests.py +++ b/tests.py @@ -1,4 +1,4 @@ -from quick_sort import quickSort +from quick_sort import quick_sort import unittest @@ -6,31 +6,31 @@ class TestQuickSort(unittest.TestCase): def test_input_array(self): arr = [10, 29, 63, 33, 85, 1, 8, 5] n = len(arr) - self.assertEqual(quickSort(arr, 0, n-1), sorted(arr)) + self.assertEqual(quick_sort(arr, 0, n - 1), sorted(arr)) def test_asc_asc(self): asc_arr = [i for i in range(100)] n = len(asc_arr) - quickSort(asc_arr, 0, n-1) - self.assertEqual(quickSort(asc_arr, 0, n-1), sorted(asc_arr)) + quick_sort(asc_arr, 0, n - 1) + self.assertEqual(quick_sort(asc_arr, 0, n - 1), sorted(asc_arr)) def test_asc_desc(self): asc_arr = [i for i in range(100)] n = len(asc_arr) - quickSort(asc_arr, 0, n-1, False) - self.assertEqual(quickSort(asc_arr, 0, n-1, False), sorted(asc_arr, reverse=True)) + quick_sort(asc_arr, 0, n - 1, False) + self.assertEqual(quick_sort(asc_arr, 0, n - 1, False), sorted(asc_arr, reverse=True)) def test_desc_desc(self): asc_arr = [i for i in range(100, 0, -1)] n = len(asc_arr) - quickSort(asc_arr, 0, n-1, False) - self.assertEqual(quickSort(asc_arr, 0, n-1, False), sorted(asc_arr, reverse=True)) + quick_sort(asc_arr, 0, n - 1, False) + self.assertEqual(quick_sort(asc_arr, 0, n - 1, False), sorted(asc_arr, reverse=True)) def test_desc_asc(self): asc_arr = [i for i in range(100, 0, -1)] n = len(asc_arr) - quickSort(asc_arr, 0, n-1) - self.assertEqual(quickSort(asc_arr, 0, n-1), sorted(asc_arr)) + quick_sort(asc_arr, 0, n - 1) + self.assertEqual(quick_sort(asc_arr, 0, n - 1), sorted(asc_arr)) if __name__ == '__main__':