贝壳w

排序算法-笔记

1、冒泡排序:

def bubbleSort(array):
        '''
        时间复杂度: 最好:O(n) 平均:O(n^2) 最坏: O(n^2)
        空间复杂度:
        稳定性:稳定
        '''
        n = len(array)
        for i in range(n):
            for j in range(n-i-1):
                if array[j]>array[j+1]:
                    array[j], array[j+1] = array[j+1], array[j]
        return array

2、快速排序

def quickSort(array):
        '''
        快速排序是冒泡排序的优化,快速排序从数组两侧进行排序
        时间复杂度:最好: O(nlogn) 最坏:O(n^2) 平均:O(nlogn)
        空间复杂度:
        稳定性:

        递归算法的时间复杂度公式:T[n] = aT[n/b] + f(n)  a为递归次数 ;
        注意:递归时基准数不要放到右侧进行递归,否则递归无法停止;基准数距不再进行递归,否则基准数据重复时可能会出错
        '''
        n = len(array)
        if n<=1:
            return array
        left_index = 0
        rigth_index = n-1
        base = array[0]
        while left_index<rigth_index:
            while array[rigth_index]>base and left_index!=rigth_index:
                rigth_index -= 1
            while array[left_index]<=base and left_index!=rigth_index:
                left_index += 1
            if left_index==rigth_index:
                array[0], array[left_index] = array[left_index], array[0]
                k = left_index
            array[left_index], array[rigth_index] = array[rigth_index], array[left_index]
        array[0:k] = quickSort(array[0:k])
        array[k+1::] = quickSort(array[k+1::])

        return array

3、选择排序

def selectionSort(array):
        '''
        时间复杂度: 最好:O(n^2) 平均:O(n^2) 最坏: O(n^2)
        空间复杂度:O(1)
        稳定性: 数组实现时不稳定,利用链表实现稳定
        '''
        n = len(array)
        for i in range(n):
            best_index = 0
            for j in range(n-i):
                if array[best_index]<array[j]:
                    best_index = j
            array[best_index], array[n-i-1] = array[n-i-1], array[best_index]
        return array

4、插入排序

def insertionSort(array):
        '''
        直接插入排序原理:将数据插入有序数组中,直至所有数据排序完成
        时间复杂度:最好: O(n) 最坏:O(n^2) 平均:O(n^2)
        空间复杂度:O(1)
        稳定性:稳定
        适用场景:
        '''
        n = len(array)
        sorted_num = 1
        for i in range(sorted_num,n):
            tmp = array[i]
            while array[i-1]>tmp and i>=1:
                array[i] = array[i-1]
                i = i-1
            array[i] = tmp
        return array

5、归并排序

    def mergeSort(array):
        '''
        时间复杂度:最好:O(nlogn) 最坏:O(nlogn) 平均O(nlogn)
        空间复杂度:O(n)
        稳定性:稳定
        '''
        n = len(array)
        if n<2:
            return array
        else:
            left = mergeSort(array[0:n//2])
            right = mergeSort(array[n//2::])
            i = j = 0
            tmp = []
            while i<n//2 and j<(n-n//2):
                if left[i]<=right[j]:
                    tmp.append(left[i])
                    i+=1
                else:
                    tmp.append(right[j])
                    j+=1
            while i<n//2:
                tmp.append(left[i])
                i+=1
            while j<(n-n//2):
                tmp.append(right[j])
                j+=1

        return tmp

6、桶排序

def bucketSort(array):
        '''
        桶排序原理: 略
        时间复杂度: 遍历数组和桶(m个桶)O(n+m)
        空间复杂度: O(m)
        适用条件: 数据范围跨度不大,桶排序非常快,是一种非比较型排序算法,但是对空间的消耗非常大
        '''
        bucket_nums = max(array)
        buckets = [0 for i in range(bucket_nums)]
        for x in array:
            buckets[x] += 1
        tmp = []
        for index,nums in enumerate(buckets):
            while nums!=0:
                tmp.append(index)
                nums -= 1
        return tmp

7、基数排序

def radixSort(array):
        '''
        基数排序:
        时间复杂度:
        空间复杂度:
        稳定性:
        适用条件
        '''
        n = len(array)
        maxnum = max(array)
        bits = 0
        k = 1
        while maxnum%10 != 0:
            bits = bits+1
            maxnum = maxnum//10
        while k<=bits:
            #print('k:',k)
            buckets = [[] for i in range(10)]
            for num in array:
                buckets[int(num/(10**(k-1))%10)].append(num)
            i = 0
            #print('buckets:{}'.format(buckets))
            for bucket in buckets:
                for x in bucket:
                    array[i] = x
                    i+=1
            #print('array:{}'.format(array))
            k+=1
        return array

 

posted on 2020-07-04 22:56  贝壳w  阅读(183)  评论(0编辑  收藏  举报

导航