排序算法--(快速排序,冒泡排序,插入排序,选择排序)

- **时间复杂度**:对排序数据的总的操作次数。反应当n变化时,操作次数呈现什么规律
- **空间复杂度**:算法在计算机内执行时所需要的存储空间的容量,它也是数据规模n的函数。

快速排序思想:通过一趟排序将待排列表分成独立的两部分,其中一部分的所有元素均比另一部分的元素小,则分别对这两部分继续重复进行此操作,以达到整个序列有序。

步骤:

使用分治法把一个串分为两个子串,具体算法描述如下:

1,从数列中挑出一个元素,称为'基准'(privot),本文将第一个选为基准;

2,比基准数小的所有元素放在基准前面,比基准数大的所有元素放在基准后面,这样完成了分区操作;

3,递归地把小于基准值元素的子数列和大于基准值元素的子数列按上述操作进行排序,递归结束条件序列的大小为0或1。

流程:

代码:

def QuickSort(array,start,end):
    length=len(array)
    i=start
    j=end
    if i>=j:
        return
    privot=array[i]
    while i<j:
        #从右往左
        while i<j and privot<=array[j]:
            j-=1
        array[i]=array[j]
        # print(array)
        # 从左往右
        while i < j and privot >= array[i]:
            i+= 1
        array[j] = array[i]
        # print(array)
    array[i]=privot
    # print(array)
    #
    QuickSort(array,start,i-1)
    QuickSort(array, i+1, end)
if __name__ == '__main__':
    array=[5,3,5,8,1,-4,56,87]
    print(array)
    QuickSort(array,0,len(array)-1)
    print(array)

冒泡排序:时间复杂度:o(n^2) = (n-1)*(n-1)

**复杂度分析:**

- 时间复杂度:若给定的数组刚好是排好序的数组,采用改进后的冒泡排序算法,只需循环一次就行了,此时是最优时间复杂度:O(n),若给定的是倒序,此时是最差时间复杂度:O(n^2) ,因此综合平均时间复杂度为:O(n^2)
- 空间复杂度:因为每次只需开辟一个temp的空间,因此空间复杂度是:O(1)

步骤:

1. 比较相邻的元素。如果第一个比第二个大,就交换它们两个;
2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
3. 针对所有的元素重复以上的步骤,除了最后一个;
4. 重复步骤1~3,直到排序完成。

代码:

"""
冒泡排序:从小到大
"""
def BubbleSort(array):
    lengths = len(array)
    for i in range(lengths-1):
        for j in range(lengths-1-i):
            if array[j] > array[j+1]:
               array[j+1], array[j] = array[j], array[j+1]

    return array

if __name__ == '__main__':
    # array=[5,3,5,8,1,-4,56,87]
    # print(array)
    # QuickSort(array,0,len(array)-1)
    # print(array)
    array = [5, 3, 5, 8, 1, -4, 56, 87]
    print("Original array: ", array)
    array = BubbleSort(array)
    print("BubbleSort: ", array)

插入排序:将未排序元素一个个插入到已排序列表中。对于未排序元素,在已排序序列中从后向前扫描,找到相应位置把它插进去;在从后向前扫描过程中,需要反复把已排序元素逐步向后挪,为新元素提供插入空间。

"""
插入排序:从小到大
"""
def InsertionnSort(array):
    lengths = len(array)
    # 从索引位置1开始
    for i in range(1, lengths):
        currentValue = array[i]  # 当前索引对应的元素数值
        preIndex = i - 1  # 前一个索引位置
        # 循环条件: 前一个索引对应元素值大于当前值,前一个索引值大于等于0
        while array[preIndex] > currentValue and preIndex >= 0:
            array[preIndex + 1] = array[preIndex]  # 前一个索引对应元素值赋值给当前值
            preIndex -= 1  # 前一个索引位置-1
        # preIndex+1,实现元素交换
        array[preIndex + 1] = currentValue

    return array


array = [1, 0, 8, -2, 3, 6, 9]
print("Original array={}".format(array))
array = InsertionnSort(array)
print("InsertionSort={}".format(array))

选择排序说明:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到找出元素的后面。以此类推,直到所有元素均排序完毕。

"""
选择排序
"""
def SelectionSort(array):
    lengths = len(array)
    for i in range(lengths - 1):
        min_index = i
        for j in range(i, lengths):
            if array[j] < array[min_index]:
                min_index = j
        array[i], array[min_index] = array[min_index], array[i]
        # print(array)
    return array


array = [1, 0, 8, -2, 3, 6, 9]
print("Original array={}".format(array))
array = SelectionSort(array)
print("InsertionSort={}".format(array))

猜你喜欢

转载自blog.csdn.net/fanzonghao/article/details/81270601