diff --git a/.idea/misc.xml b/.idea/misc.xml index b4319e3..a6218fe 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,7 @@ - + + + \ No newline at end of file diff --git a/.idea/pygorithm.iml b/.idea/pygorithm.iml index eda47f2..909438d 100644 --- a/.idea/pygorithm.iml +++ b/.idea/pygorithm.iml @@ -2,7 +2,7 @@ - + \ No newline at end of file diff --git a/sort/bubble_sort.py b/sort/bubble_sort.py new file mode 100644 index 0000000..65e5c67 --- /dev/null +++ b/sort/bubble_sort.py @@ -0,0 +1,98 @@ +def bubble_sort1(nums: list[int]): + if len(nums) <= 1: + return nums + + # 外层循环表示是在排序第i个最大值 + for i in range(len(nums)): + # 减 1 防止索引越界 + # 减 i 表示已经将 i 个最大值排序到了末尾,无需再比较 + for j in range(len(nums) - i - 1): + if nums[j] > nums[j + 1]: + nums[j], nums[j + 1] = nums[j + 1], nums[j] + + +""" +冒泡排序优化1:使用一个标志位,对列表中已排序的部分不再排序 +""" + + +def bubble_sort2(nums: list[int]): + compare: bool = True + length = len(nums) + + while length > 0 and compare: + compare = False + for i in range(length): + if nums[i] > nums[i + 1]: + nums[i], nums[i + 1] = nums[i + 1], nums[i] + # 数据无序,后续部分仍需比较 + compare = True + # 每次比较,最大的数都会被放到末尾,因此减1,减少一次对比 + length -= 1 + + +""" +冒泡排序优化2:鸡尾酒排序,双向排序 +""" + + +def bubble_sort3(nums: list[int]): + length = len(nums) + if length <= 1: + return nums + + bubble = True + for i in range(length >> 1): + if bubble: + bubble = False + + # 从左到右冒泡 + for j in range(i, length - i - 1): + if nums[j] > nums[j + 1]: + nums[j], nums[j + 1] = nums[j + 1], nums[j] + bubble = True + + for j in range(length - i - 1, i, -1): + if nums[j] < nums[j - 1]: + nums[j], nums[j - 1] = nums[j - 1], nums[j] + bubble = True + + else: + break + + +""" +冒泡排序优化3:梳排序,在冒泡排序中,只会比较数组中相邻的项,比较间距为 1 + +梳排序中,开始比较间距设定为数组长度,并在循环中以固定的比率递减,通常递减率为 1.3, +该数字是原作者通过实验得到的最有效递减率 +""" + + +def comb_sort(nums: list[int]): + if len(nums) <= 1: + return nums + + gap = len(nums) + + # 大致排序,数据基本有序 + while gap > 0: + gap = int(gap * 0.8) + i = gap + while i < len(nums): + if nums[i - gap] > nums[i]: + nums[i], nums[i - gap] = nums[i - gap], nums[i] + i += 1 + + # 细致调节无序部分 + exchange = True + while exchange: + exchange = False + i = 0 + while i < len(nums) - 1: + if nums[i] > nums[i + 1]: + nums[i], nums[i + 1] = nums[i + 1], nums[i] + exchange = True + + i += 1 +