數據結構和算法----排序算法day1

  • 分析排序算法
  1. 排序算法的執行效率

1)、時間複雜度的最好,最壞,平均情況

      2)、時間複雜度的係數,常數,低階

      3)、比較次數和交換次數

2、排序算法的內存消耗

   我們可以通過空間複雜度來衡量

  1. 排序算法的穩定性

穩定性就是經過排序之後,相等的元素的先後順序不改變

  • 常用的排序算法及實現

這裏只些一些常用的排序算法如:冒泡排序、插入排序、希爾排序、選擇排序、歸併排序、快速排序、計數排序、基數排序、桶排序。

  1. 冒泡排序
    1. 原理

比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。

對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。這步做完後,最後的元素會是最大的數。

針對所有的元素重複以上的步驟,除了最後已經選出的元素(有序)。

持續每次對越來越少的元素(無序元素)重複上面的步驟,直到沒有任何一對數字需要比較,則序列最終有序。

          

    1. 代碼實現:
data = [1,3,2,6,4,5]

len_list = len(data)

for i in range(len_list):

    for j in range(len_list-i-1):

       if data[j] > data[j+1]:

          data[j], data[j+1] = data[j+1], data[j]
    1. 代碼優化:

如果冒泡操作已經沒有數據交換時,說明已經達到完全有序,不用再執行冒泡操作

data = [1,3,2,6,4,5]
len_list = len(data)

for i in range(len_list):

   count = 0

   for j in range(len_list-i-1):

       if data[j] > data[j+1]:

           count += 1

           data[j+1],data[j] = data[j],data[j+1]

   if count == 0:

       break
    1.  冒泡排序分析:

空間複雜度:冒泡排序只涉及相鄰數據交換,所以空間複雜度爲O(1)

           穩定性:冒泡排序,如果相鄰數據大小相等我們不會對其進行交換,所以相同大小的數據在排序前後不會改變順序,所有冒泡排序是穩定的排序算法  

           時間複雜度:最好的情況,數據已經是有序的進行一次冒泡操作即可。所以最好時間複雜度爲O(n)

                       最壞的情況是數據爲逆序,需要進行n次冒泡操作所以最壞時間複雜度爲O(n^2)

  1. 插入排序
    1. 原理

將數組分爲已排序區間未排序區間,初始狀態是將數組第一個原素放在已排序空間,然後再未排序空間取出數據按順序插入已排序空間。

 

    1. 代碼實現

#encoding:utf-8

def charu(lis):

    for i in range(1,len(lis)):

        j = i-1

        value = lis[i]

        while j >=0:

            if value < lis[j]:

                lis[j+1] = lis[j]

                lis[j] = value

                      j = j - 1

    1. 分析

空間複雜度:插入排序屬於原地排序算法,所以其空間複雜度爲O(1)

           是否穩定:在插入時如果遇到值相同的數據,我們可以選擇按先後順序排序。這樣插入排序就屬於穩定的排序算法

           時間複雜度:

最好時間複雜度:每次插入時只對比一次,就能確定插入位置,時間複雜度爲O(n),

最壞時間複雜度:每次插入都要插入到數組的第一個位置,時間複雜度爲O(n)

平均時間複雜度:在數組中插入數據的平均時間複雜度爲O(n),需要執行n次插入操作。所以插入排序的平均時間複雜度爲O(n^2)

  1. 希爾排序
    1. 原理:

先將待排序元素序列分割成多個子序列,然後再分別進行插入排序,然後依次縮小子序列個數,再進行排序。

 

    1. 代碼:

#encoding:utf-8

def xier(lis):

    num = len(lis)//2

    while num > 0:

        for i in range(num,len(lis)):

            j = i - num

            value = lis[i]

            while j >= 0:

                if value < lis[j]:

                    lis[j+num],lis[j] = lis[j],value

                j -= num

            num //= 2

    1. 分析:

空間複雜度:O(1)

時間複雜度:最優時間複雜度爲O(nlogn)

            最壞時間複雜度爲O(n^2)

是否穩定:不穩定

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