一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語(yǔ)言編程技術(shù)及教程分享平臺(tái)!
分類導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Python - Python實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu)與算法之快速排序詳解

Python實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu)與算法之快速排序詳解

2020-06-10 09:48RussellLuo Python

這篇文章主要介紹了Python實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu)與算法之快速排序,詳細(xì)分析了快速排序的原理與Python實(shí)現(xiàn)技巧,需要的朋友可以參考下

本文實(shí)例講述了Python實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu)與算法之快速排序。分享給大家供大家參考。具體分析如下:

一、概述

快速排序(quick sort)是一種分治排序算法。該算法首先 選取 一個(gè)劃分元素(partition element,有時(shí)又稱為pivot);接著重排列表將其 劃分 為三個(gè)部分:left(小于劃分元素pivot的部分)、劃分元素pivot、right(大于劃分元素pivot的部分),此時(shí),劃分元素pivot已經(jīng)在列表的最終位置上;然后分別對(duì)left和right兩個(gè)部分進(jìn)行 遞歸排序

其中,劃分元素的 選取 直接影響到快速排序算法的效率,通常選擇列表的第一個(gè)元素或者中間元素或者最后一個(gè)元素作為劃分元素,當(dāng)然也有更復(fù)雜的選擇方式;劃分 過(guò)程根據(jù)劃分元素重排列表,是快速排序算法的關(guān)鍵所在,該過(guò)程的原理示意圖如下:

<-- 選取劃分元素 -->

Python實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu)與算法之快速排序詳解

<-- 劃分過(guò)程 -->

Python實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu)與算法之快速排序詳解

<-- 劃分結(jié)果 -->

Python實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu)與算法之快速排序詳解

快速排序算法的優(yōu)點(diǎn)是:原位排序(只使用很小的輔助棧),平均情況下的時(shí)間復(fù)雜度為 O(n log n)。快速排序算法的缺點(diǎn)是:它是不穩(wěn)定的排序算法,最壞情況下的時(shí)間復(fù)雜度為 O(n2)。

二、Python實(shí)現(xiàn)

1、標(biāo)準(zhǔn)實(shí)現(xiàn)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/usr/bin/env python
# -*- coding: utf-8 -*-
def stdQuicksort(L):
  qsort(L, 0, len(L) - 1)
def qsort(L, first, last):
  if first < last:
    split = partition(L, first, last)
    qsort(L, first, split - 1)
    qsort(L, split + 1, last)
def partition(L, first, last):
  # 選取列表中的第一個(gè)元素作為劃分元素
  pivot = L[first]
  leftmark = first + 1
  rightmark = last
  while True:
    while L[leftmark] <= pivot:
 # 如果列表中存在與劃分元素pivot相等的元素,讓它位于left部分
     # 以下檢測(cè)用于劃分元素pivot是列表中的最大元素時(shí),
  #防止leftmark越界
      if leftmark == rightmark:
        break
      leftmark += 1
    while L[rightmark] > pivot:
      # 這里不需要檢測(cè),劃分元素pivot是列表中的最小元素時(shí),
      # rightmark會(huì)自動(dòng)停在first處
      rightmark -= 1
    if leftmark < rightmark:
      # 此時(shí),leftmark處的元素大于pivot,
   #而rightmark處的元素小于等于pivot,交換二者
      L[leftmark], L[rightmark] = L[rightmark], L[leftmark]
    else:
      break
  # 交換first處的劃分元素與rightmark處的元素
  L[first], L[rightmark] = L[rightmark], L[first]
  # 返回劃分元素pivot的最終位置
  return rightmark

2、Pythonic實(shí)現(xiàn)

?
1
2
3
4
5
6
7
#!/usr/bin/env python
# -*- coding: utf-8 -*-
def pycQuicksort(L):
  if len(L) <= 1: return L
  return pycQuicksort([x for x in L if x < L[0]]) + \
      [x for x in L if x == L[0]] + \
      pycQuicksort([x for x in L if x > L[0]])

對(duì)比 標(biāo)準(zhǔn)實(shí)現(xiàn) 可以看出,Pythonic實(shí)現(xiàn) 更簡(jiǎn)潔、更直觀、更酷。但需要指出的是,Pythonic實(shí)現(xiàn) 使用了Python中的 列表解析 (List Comprehension,也叫列表展開、列表推導(dǎo)),每一次 遞歸排序 都會(huì)產(chǎn)生新的列表,因此失去了快速排序算法本來(lái)的 原位排序 的優(yōu)點(diǎn)。

三、算法測(cè)試

?
1
2
3
4
5
6
7
8
9
10
#!/usr/bin/env python
# -*- coding: utf-8 -*-
if __name__ == '__main__':
  L = [54, 26, 93, 17, 77, 31, 44, 55, 20]
  M = L[:]
  print('before stdQuicksort: ' + str(L))
  stdQuicksort(L)
  print('after stdQuicksort: ' + str(L))
  print('before pycQuicksort: ' + str(M))
  print('after pycQuicksort: ' + str(pycQuicksort(M)))

運(yùn)行結(jié)果:

?
1
2
3
4
5
$ python testquicksort.py
before stdQuicksort: [54, 26, 93, 17, 77, 31, 44, 55, 20]
after stdQuicksort: [17, 20, 26, 31, 44, 54, 55, 77, 93]
before pycQuicksort: [54, 26, 93, 17, 77, 31, 44, 55, 20]
after pycQuicksort: [17, 20, 26, 31, 44, 54, 55, 77, 93]

希望本文所述對(duì)大家的Python程序設(shè)計(jì)有所幫助。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 人人爱天天做夜夜爽88 | 日本人和黑人一级纶理片 | 91大神大战高跟丝袜美女 | 果冻传媒91 | 小草视频免费观看在线 | 欧美摘花破处 | 国色天香社区视频在线观看免费完整版 | 5151hh四虎国产精品 | 电车痴汉(han) | a级黄色视屏| 女人用粗大自熨喷水在线视频 | 精品国产人妻国语 | 99av导航 | 成人免费观看网欧美片 | 欧美整片在线 | 欧美搞逼视频 | 7个黑人玩北条麻妃 | 国内亚州视频在线观看 | 国产高清不卡码一区二区三区 | 女人张开腿让男人桶爽 | 韩国女主播一区二区视频 | 日本亚洲免费 | 日本免费看 | 波多野结衣中文字幕 | 成人 在线欧美亚洲 | 99精品国产高清自在线看超 | 师尊被各种play打屁股 | 久99视频精品免费观看福利 | 嗯啊好大视频 | 国产精品99在线观看 | 痴mu动漫成年动漫在线观看 | 久久人妻少妇嫩草AV無碼 | 办公室大战秘书呻吟 | a在线观看欧美在线观看 | 91免费精品国自产拍在线不卡 | 福利一区在线观看 | 91天堂一区二区 | 成人在线av视频 | 毛片网在线观看 | 大伊香蕉在线精品不卡视频 | 国产欧美一区二区三区免费看 |