数据结构复习总结之冒泡排序和选择排序(一)

颓废了两周,有时候就是会周期性的心情失落,学不进去,还好现在调整过来啦~~
其实很多时候都是太闲了,想的太多,其实可以多去做,不要老是瞎想,生活充实就会好啦~~

*******************************正经分割线*********************************
今天学了单向链表插入删除,双向链表的插入删除,大致原理是懂了,本科没学懂的指针终于看懂啦~~~
接下来就是对线性表(链表本质上也是线性表)元素排序算法的相关介绍(以升序为例

冒泡排序

原理概述

其实就是从头开始遍历,每一次遍历都是比较表中该位置的元素1和下一位置元素2的大小,然后如果前面的元素比后边的元素大,就会交换它们俩的位置,接下俩再继续比较元素2和它下一个元素3的大小,再根据其大小决定是否交换位置,直到末尾完成一次遍历。也就是说当一次遍历结束之后表中最大的元素会自动的落在表的最后,然后再进行第二次遍历,,,以此类推。

理解起来不难,但是需要注意下标

代码实现
# -*- coding: utf-8 -*-
"""
Created on Fri May 25 22:05:25 2018

@author: xuanxuan
"""

#*************************************冒泡排序*****************************************

def Bubble_sort(L):
    n=len(L)
    print("排序之前:",L)
    for i in range(n-1):  #需要遍历的次数
        for j in range(n-1-i):
            if L[j]>L[j+1]:
                L[j],L[j+1]=L[j+1],L[j]
    print("排序之后:",L)

Bubble_sort([4,2,5,3,1,8,6])

时间复杂度

根据代码很容易看出来 冒泡排序的时间复杂度为O(n^2)

稳定性

指的是当表中存在数值相等的元素时,使用排序算法不会改变原来元素相应的位置
冒泡排序 其实画一下图就可以很明显的看出来当两个元素相等时,仍会把后边那个元素放在后边(已排好部分)并不会改变元素原来的相对位置。

选择排序

原理概述

就是把待排序的表分为两部分,已排序和未排序,每次遍历都是选择未排序部分的最小值放到相应的已排序部分(追加),比如说对于第一次遍历 都是未排序部分,所以是选择该表中最小的元素放到表的最前面,其实也就是把该最小值与表的第一个元素进行交换

代码实现
#*************************************选择排序*****************************************

def Select_sort(L):
    n=len(L)
    print("选择排序前:",L)
    for i in range(n-1):
        min=i  #把未排序部分的第一个元素当成该次遍历的最小值 相当于初始化了
        for j in range(i+1,n):
            if L[min]>L[j]:
                min=j
        #对于此次遍历已经找到未排序部分的最小值索引了min
        L[i],L[min]=L[min],L[i]  #把未排序部分的最小值追加到已排序部分
    print("选择排序后:",L)
Select_sort([4,2,5,3,1,8,6])        
时间复杂度

选择排序的时间复杂度很明显也是O(n^2)

稳定性

选择排序当划分数据为未排序部分和排序部分,也就是每次遍历未排序部分选择其中最大的放到最后边(已排序部分) 这样一来当两个值相等时 排序之后相对顺序就会改变,因为对于第一个出现的元素 当它是未排序部分最大时 即使后边遇到第二个相等的元素(由于该第二个出现的元素只是相等并不是比它大)所以仍会选择第一个出现的元素放到已排序部分(也就是表的最后),这样这两个值的相对顺序就会改变,不稳定了。

今天就先到这吧~~
明天也要加油鸭~~~

猜你喜欢

转载自blog.csdn.net/jiaowosiye/article/details/80457551