国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Python > 正文

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

2020-02-23 00:49:05
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

本文實(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ò)程的原理示意圖如下:

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

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

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

快速排序算法的優(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)

#!/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)

#!/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]])            
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 托里县| 福泉市| 扬州市| 高安市| 龙门县| 开原市| 长垣县| 岳阳市| 靖江市| 汪清县| 五莲县| 邹城市| 安仁县| 邹平县| 茶陵县| 司法| 驻马店市| 开原市| 晋江市| 隆化县| 固原市| 静安区| 偃师市| 东阿县| 台州市| 孝感市| 山东省| 田东县| 合江县| 河津市| 巧家县| 宜春市| 青河县| 温州市| 洛浦县| 松溪县| 洮南市| 罗城| 承德县| 寿阳县| 甘德县|