欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

python基本排序算法

系統(tǒng) 1942 0

一、冒泡排序

  這個算法的名字由來是因為越大的元素會經(jīng)由交換慢慢“浮”到數(shù)列的頂端(升序或降序排列),就如同碳酸飲料中二氧化碳的氣泡最終會上浮到頂端一樣,故名“冒泡排序”。

  冒泡排序算法的原理如下:
  1. 比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
  2. 對每一對相鄰元素做同樣的工作,從開始第一對到結(jié)尾的最后一對。在這一點,最后的元素應(yīng)該會是最大的數(shù)。
  3. 針對所有的元素重復(fù)以上的步驟,除了最后一個。
  4. 持續(xù)每次對越來越少的元素重復(fù)上面的步驟,直到?jīng)]有任何一對數(shù)字需要比較。
            
              #
            
            
              !/usr/bin/env python
            
            
              
#
            
            
               -*- coding: utf-8 -*-
            
            
              
li 
            
            = [99, 0, -1, 46, -87, 7, 17, 20
            
              ]

le 
            
            = len(li)  
            
              #
            
            
               長度8
            
            
              for
            
             i 
            
              in
            
             range(le):  
            
              #
            
            
               [0,7] 持續(xù)每次對越來越少的元素重復(fù)上面的步驟,直到?jīng)]有任何一對數(shù)字需要比較。
            
            
              for
            
             j 
            
              in
            
             range(le - i - 1):  
            
              #
            
            
               針對所有的元素重復(fù)以上的步驟,除了最后一個。
            
            
              if
            
             li[j + 1] > li[j]:  
            
              #
            
            
               比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
            
            
            li[j], li[j + 1] = li[j + 1
            
              ], li[j]
            
            
            
              #
            
            
               這里不要break,
            
            
              print
            
            (li)
          

二、選擇排序

  選擇排序是一種簡單直觀的排序算法。它的工作原理是每一次從待排序的數(shù)據(jù)元素中選出最小(或最大)的一個元素,存放在序列的起始位置,然后,再從剩余未排序元素中繼續(xù)尋找最小(大)元素,然后放到已排序序列的末尾。以此類推,直到全部待排序的數(shù)據(jù)元素排完。 選擇排序是不穩(wěn)定的排序方法。

            
              #
            
            
              !/usr/bin/env python
            
            
              
#
            
            
               -*- coding: utf-8 -*-
            
            
              
li 
            
            = [99, 0, -1, 46, -87, 7, 17, 20
            
              ]

le 
            
            = len(li)  
            
              #
            
            
               長度8
            
            
              for
            
             i 
            
              in
            
             range(le):  
            
              #
            
            
               [0,7]
            
            
    max_val = i  
            
              #
            
            
               記錄最大值的角標(biāo),我們先假設(shè)i為最大值
            
            
              for
            
             j 
            
              in
            
             range(i + 1, le):  
            
              #
            
            
               再去循環(huán)我們假設(shè)的最大值和其它值去逐個比較
            
            
              if
            
             li[j] > li[max_val]:  
            
              #
            
            
               當(dāng)有值比我們假設(shè)的最大值大時,我們記錄角標(biāo)
            
            
            max_val =
            
               j
    li[i], li[max_val] 
            
            = li[max_val], li[i]  
            
              #
            
            
               這樣我們循環(huán)i次以后,我們就可以得到集合內(nèi)的最大值,然后我們放在第i個位置,
            
            
              print
            
            (li)
          

為什么我們回收選擇排序是不穩(wěn)定的排序呢?簡單地說就是所有相等的數(shù)經(jīng)過某種排序方法后,仍能保持它們在排序之前的相對次序,我們就
說這種排序方法是穩(wěn)定的。反之,就是非穩(wěn)定的。例如我們要排序[ 1 , 1 , 1 , 1 , 1 , 1 , 1 ],實則我們排序之后,每一個1的順序是不會變化的,還是按照原來的顏色放置就是穩(wěn)定排序。也就是說排序以后還是這樣的[ 1 , 1 , 1 , 1 , 1 , 1 , 1 ]

三、插入排序

插入排序是一種簡單直觀且穩(wěn)定的 排序算法 。如果有一個已經(jīng)有序的數(shù)據(jù)序列,要求在這個已經(jīng)排好的數(shù)據(jù)序列中插入一個數(shù),但要求插入后此數(shù)據(jù)序列仍然有序,這個時候就要用到一種新的排序方法—— 插入排序法 ,插入排序的基本操作就是將一個數(shù)據(jù)插入到已經(jīng)排好序的有序數(shù)據(jù)中,從而得到一個新的、個數(shù)加一的有序數(shù)據(jù),算法適用于少量數(shù)據(jù)的排序, 時間復(fù)雜度 為O(n^2)。 是穩(wěn)定的排序方法 。插入算法把要排序的 數(shù)組 分成兩部分:第一部分包含了這個數(shù)組的所有元素,但將最后一個元素除外(讓數(shù)組多一個空間才有插入的位置),而第二部分就只包含這一個元素(即待插入元素)。在第一部分排序完成后,再將這個最后元素插入到已排好序的第一部分中。

  插入排序的基本思想是:每步將一個待排序的記錄,按其關(guān)鍵碼值的大小插入前面已經(jīng)排序的文件中適當(dāng)位置上,直到全部插入完為止。

            
              #
            
            
              !/usr/bin/env python
            
            
              
#
            
            
               -*- coding: utf-8 -*-
            
            
li = [9, 0, -1, 46, -87, 7, 17, 20
            
              ]

le 
            
            = len(li)  
            
              #
            
            
               長度8
            
            
              
k 
            
            = 0  
            
              #
            
            
               記錄交換次數(shù)
            
            
              for
            
             i 
            
              in
            
             range(1
            
              , le):
    val 
            
            = li[i]  
            
              #
            
            
               先記下每次大循環(huán)走到的第幾個元素的值
            
            
    j =
            
               i
    
            
            
              while
            
             j > 0 
            
              and
            
             li[j - 1] < val:  
            
              #
            
            
               循環(huán)次數(shù)j大于0  and  前一位數(shù)大于后一位數(shù)
            
            
        li[j] = li[j - 1]  
            
              #
            
            
               將后一位數(shù)放到前面,根據(jù)值的大小排序
            
            
        j -= 1  
            
              #
            
            
               把前面的數(shù)放到后面
            
            
        k += 1
            
              
    li[j] 
            
            = val  
            
              #
            
            
               已經(jīng)找到了左邊排序好的列表里不小于val的元素的位置,把val放在這里
            
            
              print
            
            
              (li)

            
            
              print
            
            (k)
          

?四、快速排序

  快速排序是對冒泡排序的一種改進(jìn)。

  通過一趟排序?qū)⒁判虻臄?shù)據(jù)分割成獨立的兩部分,其中一部分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)都要小,然后再按此方法對這兩部分?jǐn)?shù)據(jù)分別進(jìn)行快速排序,整個排序過程可以 遞歸 進(jìn)行,以此達(dá)到整個數(shù)據(jù)變成有序 序列

            
              #
            
            
              !/usr/bin/env python
            
            
              
#
            
            
               -*- coding: utf-8 -*-
            
            
              """
            
            
              
1)設(shè)置兩個變量i、j,排序開始的時候:i=0,j=N-1;
2)以第一個數(shù)組元素作為關(guān)鍵數(shù)據(jù),賦值給key,即key=A[0];
3)從j開始向前搜索,即由后開始向前搜索(j--),找到第一個小于key的值A(chǔ)[j],將A[j]和A[i]互換;
4)從i開始向后搜索,即由前開始向后搜索(i++),找到第一個大于key的A[i],將A[i]和A[j]互換;
5)重復(fù)第3、4步,直到i=j; (3,4步中,沒找到符合條件的值,即3中A[j]不小于key,4中A[i]不大于key的時候改變j、i的值,使得j=j-1,i=i+1,
直至找到為止。找到符合條件的值,進(jìn)行交換的時候i, j指針位置不變。另外,i==j這一過程一定正好是i+或j-完成的時候,此時令循環(huán)結(jié)束)。

            
            
              """
            
            
              
li 
            
            = [9, 0, -1, 46, -87, 7, 17, 20
            
              ]

le 
            
            =
            
               len(li)



            
            
              def
            
            
               QuickSort(li, start, end):
    
            
            
              #
            
            
               判斷end結(jié)束是否小于start開始,如果為false,直接返回
            
            
              if
            
             start <
            
               end:
        i, j 
            
            =
            
               start, end
        
            
            
              #
            
            
               設(shè)置基準(zhǔn)數(shù)
            
            
        base =
            
               li[i]
        
            
            
              while
            
             i <
            
               j:
            
            
            
              #
            
            
               如果列表后邊的數(shù),比基準(zhǔn)數(shù)大或相等,則前移一位直到有比基準(zhǔn)數(shù)小的數(shù)出現(xiàn)
            
            
              while
            
             (i < j) 
            
              and
            
             (li[j] >=
            
               base):
                j 
            
            = j - 1
            
            
              #
            
            
               如找到,則把第j個元素賦值給第個元素i,此時表中i,j個元素相等
            
            
            li[i] =
            
               li[j]
            
            
            
              #
            
            
               同樣的方式比較前半?yún)^(qū)
            
            
              while
            
             (i < j) 
            
              and
            
             (li[i] <=
            
               base):
                i 
            
            = i + 1
            
              
            li[j] 
            
            =
            
               li[i]
        
            
            
              #
            
            
               做完第一輪比較之后,列表被分成了兩個半?yún)^(qū),并且i=j,需要將這個數(shù)設(shè)置回base
            
            
        li[i] =
            
               base
        
            
            
              #
            
            
               遞歸前后半?yún)^(qū)
            
            
        QuickSort(li, start, i - 1
            
              )
        QuickSort(li, j 
            
            + 1
            
              , end)
    
            
            
              return
            
            
               li


sortli 
            
            = QuickSort(li, 0, le - 1
            
              )

            
            
              print
            
            (sortli)
          

五、歸并排序

  歸并排序是建立在歸并操作上的一種有效的排序算法,該算法是采用分治法的一個非常典型的應(yīng)用。將已有序的子序列合并,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合并成一個有序表,稱為二路歸并。

            
              #
            
            
              !/usr/bin/env python
            
            
              
#
            
            
               -*- coding: utf-8 -*-
            
            
              def
            
            
               merge(a, b):
    c 
            
            =
            
               []
    h 
            
            = j =
            
               0
    
            
            
              while
            
             j < len(a) 
            
              and
            
             h <
            
               len(b):
        
            
            
              if
            
             a[j] <
            
               b[h]:
            c.append(a[j])
            j 
            
            += 1
        
            
              else
            
            
              :
            c.append(b[h])
            h 
            
            += 1

    
            
              if
            
             j ==
            
               len(a):
        
            
            
              for
            
             i 
            
              in
            
            
               b[h:]:
            c.append(i)
    
            
            
              else
            
            
              :
        
            
            
              for
            
             i 
            
              in
            
            
               a[j:]:
            c.append(i)

    
            
            
              return
            
            
               c



            
            
              def
            
            
               merge_sort(lists):
    
            
            
              if
            
             len(lists) <= 1
            
              :
        
            
            
              return
            
            
               lists
    middle 
            
            = int(len(lists) / 2
            
              )
    left 
            
            =
            
               merge_sort(lists[:middle])
    right 
            
            =
            
               merge_sort(lists[middle:])
    
            
            
              return
            
            
               merge(left, right)



            
            
              if
            
            
              __name__
            
             == 
            
              '
            
            
              __main__
            
            
              '
            
            
              :
    li 
            
            = [9, 0, -1, 46, -87, 7, 17, 20, 2
            
              ]
    
            
            
              print
            
            (merge_sort(li))
          

?


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 婷婷色综合久久 | 久久久久成人精品免费播放动漫 | 免费的av网站 | 国产99久久精品一区二区永久免费 | 亚洲欧美在线观看一区二区 | 成人嫩草影院免费观看 | 啪啪乐视频| 免费看污网站 | 日日摸夜夜摸狠狠摸日日碰夜夜做 | 99thz桃花论坛 | 精品视频网站 | 成人一级| 亚洲日本天堂在线 | 欧美一级久久 | 午夜性色一区二区三区不卡视频 | 欧美激情久久久久久久久 | 国内外一级毛片 | 亚洲一区在线观看视频 | 久久在线观看 | 午夜精品影院 | 日本欧美国产精品第一页久久 | 日本色播 | 高清视频一区 | 国产精品视频一区二区三区 | 午夜日韩 | 亚洲精品日韩在线 | 亚洲欧美第一视频 | 国产美女亚洲精品久久久综合 | 狠狠色狠色综合曰曰 | 91视频苹果版 | 久久综合九色综合97婷婷群聊 | 午夜欧美 | 午夜性电影 | 国产日韩欧美不卡 | 5月婷婷6月丁香 | 免费午夜不卡毛片 | 久爱视频www在线播放 | 97中文| 亚洲欧洲精品一区二区三区 | 久久久一区二区 | 精品视频麻豆入口 |