Python基於比較的排序

2022-07-04 01:36:10 字數 4596 閱讀 6619

1.平均時間複雜度均為o(n2)的排序

1.1 插入排序

插入排序對少量元素的排序非常有效。工作機制就像打牌一樣,為了將牌插入到已排好序的牌中,需要將牌與手中的牌從右向左進行比較。

1.2 氣泡排序氣泡排序通過重複的交換相鄰的兩個反序元素來將最大元素置於陣列末尾。

1.3 選擇排序首先找出序列中的最大元素,與最後乙個元素交換位置,然後找出次大元素,與倒數第二個元素交換位置,以此類推。

1.4 希爾排序shell排序通過比較相距一定間隔的元素來工作。各趟排序隨著演算法的進行而減小,直到只比較相鄰元素的最後一趟為止。

使用希爾增量(ht=n/2,hk=hk+1/2)時希爾排序的最壞執行時間為θ(n2),使用hibbard增量(1,3,7,...,2k-1)的希爾排序的最壞執行時間為θ(n3/2)。

2.平均時間複雜度均為o(nlogn)的排序2.1 合併排序合併排序基本的操作是合併兩個已排序的表。它是遞迴演算法的乙個很好的例項。合併排序需要花費將資料拷貝到臨時陣列再拷貝回來這樣一些附加的工作。

k=0while i合併排序的另一種非遞迴實現

i=1while i2.2 堆排序

建立最大堆後將最大元素與堆最後的單元互換,堆大小縮小一,然後執行根的下濾操作找出第二大的元素。

2.3 快速排序快速排序是在實踐中最快的已知排序演算法,像合併排序一樣也是一種分治的遞迴演算法。

1.如果元素個數為0或1,則返回。

2.取陣列中任一元素v,稱之為樞紐元。

3.將陣列分為2個不相交的部分,一部分元素小於v,另一部分大於v。

4.對兩部分分別遞迴的使用快速排序。

下圖取第乙個元素為樞紐元v,leftmark從第二個元素開始,rightmark從倒數第乙個元素開始。

當leftmark在rightmark左邊時,將leftmark右移,移過小於v的元素,將rightmark左移,移過大於v的元素,當leftmark,rightmark停止時,

將leftmark和rightmark元素互換,直到leftmark到rightmark右邊為止。

if i另一種寫法

def quicksort(alist):

n=len(alist)

_quicksort(alist,0,n-1)

return alist

def _quicksort(alist,s,e):

if s

v=alist[e]

i=s #用i將陣列分為兩部分

for j in xrange(s,e):

if alist[j]<=v:

alist[j],alist[i]=alist[i],alist[j]

i+=1

alist[e],alist[i]=alist[i],alist[e]

_quicksort(alist,s,i-1)

_quicksort(alist,i+1,e)

基於比較的排序

1 插入排序 折半插排 減治演算法排序 每次從無序區間選擇第乙個數,插入到有序區間的合適位置 2 3 4 5 9 1768 1 2 3 4 5 9 768 1 2 3 4 5 7 9 68 一共需要多少次插入 size 1 想清楚有序區間 無序區間 插入過程 每次把無序區間的第乙個數進行插入 在有序...

基於比較的排序(一)

整個區間被分成有序區間和無序區間 選擇無序區間的第乙個元素插入到有序區間合適的位置 public static void insertsort int array array j 1 v 希爾排序法的基本思想是 先選定乙個整數,把待排序檔案中所有記錄分成個組,所有距離為此整數的記錄分在同一組內,並對...

演算法 排序 非基於比較的排序

非基於比較的排序與樣本的資料狀況有很大的關係,由於這個限制使其在工程中並不常用。非基於比較的排序有桶排序,基數排序,計數排序。這三者都能做到排序的穩定性,時間複雜度為 o n 空間複雜度為 o n 假設存在一組資料,裡面的資料只有 0 60 使用非基於比較的排序。思路 此時可以使用計數排序,準備 6...