數據結構複習總結之冒泡排序和選擇排序(一)

頹廢了兩週,有時候就是會週期性的心情失落,學不進去,還好現在調整過來啦~~
其實很多時候都是太閒了,想的太多,其實可以多去做,不要老是瞎想,生活充實就會好啦~~

*******************************正經分割線*********************************
今天學了單向鏈表插入刪除,雙向鏈表的插入刪除,大致原理是懂了,本科沒學懂的指針終於看懂啦~~~
接下來就是對線性表(鏈表本質上也是線性表)元素排序算法的相關介紹(以升序爲例

冒泡排序

原理概述

其實就是從頭開始遍歷,每一次遍歷都是比較表中該位置的元素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)

穩定性

選擇排序當劃分數據爲未排序部分和排序部分,也就是每次遍歷未排序部分選擇其中最大的放到最後邊(已排序部分) 這樣一來當兩個值相等時 排序之後相對順序就會改變,因爲對於第一個出現的元素 當它是未排序部分最大時 即使後邊遇到第二個相等的元素(由於該第二個出現的元素只是相等並不是比它大)所以仍會選擇第一個出現的元素放到已排序部分(也就是表的最後),這樣這兩個值的相對順序就會改變,不穩定了。

今天就先到這吧~~
明天也要加油鴨~~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章