美文网首页
Python实现排序算法

Python实现排序算法

作者: ThompsonHen | 来源:发表于2021-04-18 17:34 被阅读0次

    冒泡排序

    一、排序流程

    • 1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
    • 2.对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
    • 3.针对所有的元素重复以上的步骤,除了最后一个。
    • 4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
    最好时间复杂度 最坏时间复杂度 平均时间复杂度
    O(n) O(n^2) O(n^2)
    def bubble_sort(nums):
        length = len(nums)
        for i in range(length):
            for j in range(1, length - i):
                if nums[j - 1] > nums[j]:
                    nums[j], nums[j-1] = nums[j - 1], nums[j]
        return nums
    

    二、选择排序

    def find_smallest(nums):
        smallest = nums[0]
        smallest_index = 0
        for index, num in enumerate(nums):
            if num < smallest:
                smallest = num
                smallest_index = index
        return smallest_index
    
    def select_sort(nums):
        sorted_nums = []
        while len(nums) > 0:
            smallest_index = find_smallest(nums)
            smallest_num = nums.pop(smallest_index)
            sorted_nums.append(smallest_selected)
        return sorted_nums
    
    最好时间复杂度 最坏时间复杂度 平均时间复杂度
    O(n^2) O(n^2) O(n^2)

    三、插入排序

    • 插入排序是指在待排序的元素中,假设前面n-1(其中n>=2)个数已经是排好顺序的,现将第n个数插到前面已经排好的序列中,然后找到合适自己的位置,使得插入第n个数的这个序列也是排好顺序的。按照此法对所有元素进行插入,直到整个序列排为有序的过程,称为插入排序
    def insert_sort(nums):
        for index, num in enumerate(nums):
            pointer = index
            while pointer > 0 and nums[pointer] > num:
                nums[pointer] = nums[pointer - 1]
                pointer -= 1
            nums[pointer] = num
        return nums
    
    最好时间复杂度 最坏时间复杂度 平均时间复杂度
    O(n) O(n^2) O(n^2)

    四、希尔排序

    • 1.算法先将要排序的一组数按某个增量d分成若干组,每组中记录的下标相差d.对每组中全部元素进行排序,然后再用一个较小的增量对它进行,在每组中再进行排序。当增量减到1时,整个要排序的数被分成一组,排序完成。

    • 2.一般的初次取序列的一半为增量,以后每次减半,直到增量为1。

    def shell_sort(nums):
        length = len(nums)
        gap = length // 2
        while gap > 0:
            for i in range(gap, length):
                temp = nums[i]
                j = i
                while j >= gap and num[j - gap] > temp:
                    j -= gap
                nums[j] = temp
            gap = gap // 2
        return nums
    
    最好时间复杂度 最坏时间复杂度 平均时间复杂度
    O(n^1.3) O(n^2) -
    希尔排序

    五、归并排序

    归并排序(Merge Sort)是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并

    def merge(left, right):
        result = []
        while left and right:
            if left[0] < right[0]:
                result.append(left.pop(0))
            else:
                result.append(right.pop(0))
        if left:
            result += left
        if right:
            result  += right
        return result
    def merge_sort(nums):
        if len(nums) <= 1:
            return nums
        mid = len(nums) // 2
        left = nums[:mid]
        right = nums[mid:]
        left = merge_sort(left)
        right = merge_sort(right)
        return merge(left, right)
    
    最好时间复杂度 最坏时间复杂度 平均时间复杂度 稳定性
    O(nlogn) O(nlogn) O(nlogn) 稳定

    六、快速排序

    • 1.首先设定一个分界值,通过该分界值将数组分成左右两部分。

    • 2.将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值。

    • 3.然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。

    • 4.重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了。

    def quick_sort(nums):
        if len(nums) <= 1:
            return nums
        pivot = nums[0]
        less = [i for i in nums[1:] if i <= pivot]
        greater = [i for i in nums[i:] if i > pivot]
        return quick_sort(less) + [pivot] + quick_sort(greater)
    
    class QuickSort:
        def quick_sort(self, nums):
            self.random_quicksort(nums, left, right)
            return nums
        def random_quicksort(self, nums, left, right):
            if left >= right:
                return
            pivot = self.random_paritition(nums, left, right)
            self.random_quicksort(nums, left, pivot - 1)
            self.random_quicksort(nums, pivot + 1, right)
        def random_partition(self, nums, left, right):
            pivot = random.randint(left, right)
            nums[right], nums[pivot] = nums[pivot], nums[right]
            i = left - 1
            for j in range(left, right):
                if nums[j] < nums[right]:
                    i += 1
                    nums[i], nums[j] = nums[j], nums[i]
            i += 1
            nums[i], nums[right] = nums[right], nums[i]
            return i
    
    最好时间复杂度 最坏时间复杂度 平均时间复杂度
    O(nlogn) O(n^2) O(nlogn)

    七、堆排序

    heapSort.gif
    def build_heap(nums, length, i):
        largest = i
        left = 2 * i + 1
        right = 2 * i + 1
        
    def heap_sort(nums):
        length = len(nums)
        for i in range(length, -1, -1):
            build_heap(nums, length, i)
    
    
    

    八、计数排序

    def counting_sort(nums, max):  # maxnumber为数组中的最大值
        length = len(nums)
        if length <= 1:
            return nums
        count_array= [0] * (max + 1)
        for num in nums:
            count_array[num] += 1
        result = []
        for i in range(max + 1):
            for j in range(count_array[i]):
                result.append(i)
        return result
    
    计数排序的时间复杂度 基于比较的排序时间复杂度下限
    O(n + k)k是整数范围 O(nlogn)

    若O(k) > O(nlogn)时其效率反而不如基于比较的排序

    相关文章

      网友评论

          本文标题:Python实现排序算法

          本文链接:https://www.haomeiwen.com/subject/zkvbfltx.html