From 86ad8ddbcf587481aac216fa3602a4dad1952238 Mon Sep 17 00:00:00 2001 From: twocucao Date: Tue, 30 Oct 2018 22:53:25 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9F=BA=E6=9C=AC=E6=8E=92=E5=BA=8F=E7=AE=97?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- algorithm/sort/sort_by_ctt.py | 120 +++++++++++++++++++++++++++++++++ tests/sort/test_sort_by_ctt.py | 77 +++++++++++++++++++++ 2 files changed, 197 insertions(+) create mode 100644 algorithm/sort/sort_by_ctt.py create mode 100644 tests/sort/test_sort_by_ctt.py diff --git a/algorithm/sort/sort_by_ctt.py b/algorithm/sort/sort_by_ctt.py new file mode 100644 index 0000000..5cb6f3c --- /dev/null +++ b/algorithm/sort/sort_by_ctt.py @@ -0,0 +1,120 @@ +""" +冒泡/插入/选择 时间复杂度 O(n^2) 基于比较 +快排/归并 O(nLogn) 基于比较 +桶,计数,基数 O(n) 不基于比较 + +评价排序算法 + +执行效率 + +1. 依照有序程度(有序度),同一算法可能有最好情况,最坏情况,平均情况。 +2. 不同阶比较阶,同一阶比较,系数,常数,低阶 +3. 比较次数和交换次数 + +稳定性 + +内存消耗 +""" + + +def get_order_degree(items): + """ + 获取有序度 + """ + order_count = 0 + items_len = len(items) + for i in range(0, items_len - 1): + for j in range(i + 1, items_len): + if items[i] < items[j]: + order_count += 1 + return order_count + + +def bubble_sort_unoptimized(items): + """ + 冒泡排序 + """ + items_len = len(items) + for i in range(1, items_len): + for j in range(1, items_len): + if items[j - 1] > items[j]: + items[j - 1], items[j] = items[j], items[j - 1] + return items + + +def bubble_sort(items): + """ + 冒泡排序 + 最好 O(n) + 最坏 O(n^2) + """ + items_len = len(items) + for i in range(1, items_len): + has_swap = False + for j in range(1, items_len): + if items[j - 1] > items[j]: + has_swap = True + items[j - 1], items[j] = items[j], items[j - 1] + if not has_swap: + break + return items + + +def bubble_sort_not_std(items): + items_len = len(items) + for i in range(items_len): + for j in range(i + 1, items_len): + if items[i] > items[j]: + items[i], items[j] = items[j], items[i] + return items + + +def insertion_sort(items): + """ + 感觉 list 类型不太适合用insertion sort + 还是其他语言里面的数组来表示会好点 + """ + print(items) + raise NotImplementedError + + +def get_min_and_index(items): + item = min(items) # O(n) + idx = items.index(item) # O(1) + return idx, item + + +def selection_sort(items): + items_len = len(items) + for i in range(items_len): + min_idx, min_item = get_min_and_index(items[i:]) + items[i], items[i + min_idx] = items[i + min_idx], items[i] + return items + + +def merge_sort(items): + # Top-down implementation + # Bottom-up implementation + # Top-down implementation using lists + # Bottom-up implementation using lists + return items + + +def quick_sort(items): + return items + + +def counting_sort(items): + return items + + +def bucket_sort(items): + return items + + +def radix_sort(items): + return items + + +def std_sorted(items): + return sorted(items) diff --git a/tests/sort/test_sort_by_ctt.py b/tests/sort/test_sort_by_ctt.py new file mode 100644 index 0000000..edd094d --- /dev/null +++ b/tests/sort/test_sort_by_ctt.py @@ -0,0 +1,77 @@ +import pytest + +from algorithm.sort.sort_by_ctt import ( + insertion_sort, + bubble_sort, + selection_sort, + merge_sort, + quick_sort, + counting_sort, + bucket_sort, + radix_sort, + std_sorted, + bubble_sort_unoptimized, + get_order_degree, + bubble_sort_not_std, +) + + +@pytest.mark.parametrize( + "test_input,expected", + [ + ([1, 2, 3], 3), + ([1, 2, 3], 3), + ([1, 2, 3], 3), + ([1, 2, 3], 3), + ([1, 2, 3], 3), + ([1, 2, 3], 3), + ([1, 2, 3], 3), + ([1, 2, 3, 4], 6), + ], +) +def test_get_order_degree(test_input, expected): + assert get_order_degree(test_input) == expected + + +def test_bubble_sort_unoptimized(items_to_be_sorted, items_expected_sorted): + assert bubble_sort_unoptimized(items_to_be_sorted) == items_expected_sorted + + +def test_bubble_sort(items_to_be_sorted, items_expected_sorted): + assert bubble_sort(items_to_be_sorted) == items_expected_sorted + + +def test_bubble_sort_not_std(items_to_be_sorted, items_expected_sorted): + assert bubble_sort_not_std(items_to_be_sorted) == items_expected_sorted + + +def test_insertion_sort(items_to_be_sorted, items_expected_sorted): + assert insertion_sort(items_to_be_sorted) == items_expected_sorted + + +def test_selection_sort(items_to_be_sorted, items_expected_sorted): + assert selection_sort(items_to_be_sorted) == items_expected_sorted + + +def test_merge_sort(items_to_be_sorted, items_expected_sorted): + assert merge_sort(items_to_be_sorted) == items_expected_sorted + + +def test_quick_sort(items_to_be_sorted, items_expected_sorted): + assert quick_sort(items_to_be_sorted) == items_expected_sorted + + +def test_radix_sort(items_to_be_sorted, items_expected_sorted): + assert radix_sort(items_to_be_sorted) == items_expected_sorted + + +def test_counting_sort(items_to_be_sorted, items_expected_sorted): + assert counting_sort(items_to_be_sorted) == items_expected_sorted + + +def test_bucket_sort(items_to_be_sorted, items_expected_sorted): + assert bucket_sort(items_to_be_sorted) == items_expected_sorted + + +def test_std_sorted(items_to_be_sorted, items_expected_sorted): + assert std_sorted(items_to_be_sorted) == items_expected_sorted