⑴ 怎樣用python將數組里的數從高到低排序
1、首先我們定義一個列表輸入一串大小不一的數字。
⑵ python幾種經典排序方法的實現
class SortMethod:
'''
插入排序的基本操作就是將一個數據插入到已經排好序的有序數據中,從而得到一個新的、個數加一的有序數據,演算法適用於少量數據的排序,時間復雜度為O(n^2)。是穩定的排序方法。
插入演算法把要排序的數組分成兩部分:
第一部分包含了這個數組的所有元素,但將最後一個元素除外(讓數組多一個空間才有插入的位置)
第二部分就只包含這一個元素(即待插入元素)。
在第一部分排序完成後,再將這個最後元素插入到已排好序的第一部分中。
'''
def insert_sort(lists):
# 插入排序
count = len(lists)
for i in range(1, count):
key = lists[i]
j = i - 1
while j >= 0:
if lists[j] > key:
lists[j + 1] = lists[j]
lists[j] = key
j -= 1
return lists
'''
希爾排序 (Shell Sort) 是插入排序的一種。也稱縮小增量排序,是直接插入排序演算法的一種更高效的改進版本。希爾排序是非穩定排序演算法。該方法因 DL.Shell 於 1959 年提出而得名。
希爾排序是把記錄按下標的一定增量分組,對每組使用直接插入排序演算法排序;隨著增量逐漸減少,每組包含的關鍵詞越來越多,當增量減至 1 時,整個文件恰被分成一組,演算法便終止。
'''
def shell_sort(lists):
# 希爾排序
count = len(lists)
step = 2
group = count / step
while group > 0:
for i in range(0, group):
j = i + group
while j < count:
k = j - group
key = lists[j]
while k >= 0:
if lists[k] > key:
lists[k + group] = lists[k]
lists[k] = key
k -= group
j += group
group /= step
return lists
'''
冒泡排序重復地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重復地進行直到沒有再需要交換,也就是說該數列已經排序完成。
'''
def bubble_sort(lists):
# 冒泡排序
count = len(lists)
for i in range(0, count):
for j in range(i + 1, count):
if lists[i] > lists[j]:
temp = lists[j]
lists[j] = lists[i]
lists[i] = temp
return lists
'''
快速排序
通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然後再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列
'''
def quick_sort(lists, left, right):
# 快速排序
if left >= right:
return lists
key = lists[left]
low = left
high = right
while left < right:
while left < right and lists[right] >= key:
right -= 1
lists[left] = lists[right]
while left < right and lists[left] <= key:
left += 1
lists[right] = lists[left]
lists[right] = key
quick_sort(lists, low, left - 1)
quick_sort(lists, left + 1, high)
return lists
'''
直接選擇排序
第 1 趟,在待排序記錄 r[1] ~ r[n] 中選出最小的記錄,將它與 r[1] 交換;
第 2 趟,在待排序記錄 r[2] ~ r[n] 中選出最小的記錄,將它與 r[2] 交換;
以此類推,第 i 趟在待排序記錄 r[i] ~ r[n] 中選出最小的記錄,將它與 r[i] 交換,使有序序列不斷增長直到全部排序完畢。
'''
def select_sort(lists):
# 選擇排序
count = len(lists)
for i in range(0, count):
min = i
for j in range(i + 1, count):
if lists[min] > lists[j]:
min = j
temp = lists[min]
lists[min] = lists[i]
lists[i] = temp
return lists
'''
堆排序 (Heapsort) 是指利用堆積樹(堆)這種數據結構所設計的一種排序演算法,它是選擇排序的一種。
可以利用數組的特點快速定位指定索引的元素。堆分為大根堆和小根堆,是完全二叉樹。大根堆的要求是每個節點的值都不大於其父節點的值,即 A[PARENT[i]] >= A[i]。
在數組的非降序排序中,需要使用的就是大根堆,因為根據大根堆的要求可知,最大的值一定在堆頂。
'''
# 調整堆
def adjust_heap(lists, i, size):
lchild = 2 * i + 1
rchild = 2 * i + 2
max = i
if i < size / 2:
if lchild < size and lists[lchild] > lists[max]:
max = lchild
if rchild < size and lists[rchild] > lists[max]:
max = rchild
if max != i:
lists[max], lists[i] = lists[i], lists[max]
adjust_heap(lists, max, size)
# 創建堆
def build_heap(lists, size):
for i in range(0, (size/2))[::-1]:
adjust_heap(lists, i, size)
# 堆排序
def heap_sort(lists):
size = len(lists)
build_heap(lists, size)
for i in range(0, size)[::-1]:
lists[0], lists[i] = lists[i], lists[0]
adjust_heap(lists, 0, i)
'''
歸並排序是建立在歸並操作上的一種有效的排序演算法,該演算法是採用分治法 (Divide and Conquer) 的一個非常典型的應用。將已有序的子序列合並,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合並成一個有序表,稱為二路歸並。
歸並過程為:
比較 a[i] 和 a[j] 的大小,若 a[i]≤a[j],則將第一個有序表中的元素 a[i] 復制到 r[k] 中,並令 i 和 k 分別加上 1;
否則將第二個有序表中的元素 a[j] 復制到 r[k] 中,並令 j 和 k 分別加上 1,如此循環下去,直到其中一個有序表取完,然後再將另一個有序表中剩餘的元素復制到 r 中從下標 k 到下標 t 的單元。歸並排序的演算法我們通常用遞歸實現,先把待排序區間 [s,t] 以中點二分,接著把左邊子區間排序,再把右邊子區間排序,最後把左區間和右區間用一次歸並操作合並成有序的區間 [s,t]。
'''
def merge(left, right):
i, j = 0, 0
result = []
while i < len(left) and j < len(right):
if left[i] <= right[j]:
result.append(left[i])
i += 1
else:
result.append(right[j])
j += 1
result += left[i:]
result += right[j:]
return result
def merge_sort(lists):
# 歸並排序
if len(lists) <= 1:
return lists
num = len(lists) / 2
left = merge_sort(lists[:num])
right = merge_sort(lists[num:])
return merge(left, right)
'''
基數排序 (radix sort) 屬於「分配式排序」 (distribution sort),又稱「桶子法」 (bucket sort) 或 bin sort,顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配至某些「桶」中,藉以達到排序的作用,基數排序法是屬於穩定性的排序。
其時間復雜度為 O (nlog(r)m),其中 r 為所採取的基數,而 m 為堆數,在某些時候,基數排序法的效率高於其它的穩定性排序法。
'''
import math
def radix_sort(lists, radix=10):
k = int(math.ceil(math.log(max(lists), radix)))
bucket = [[] for i in range(radix)]
for i in range(1, k+1):
for j in lists:
bucket[j/(radix**(i-1)) % (radix**i)].append(j)
del lists[:]
for z in bucket:
lists += z
del z[:]
return lists
---------------------
作者:CRazyDOgen
來源:CSDN
原文:https://blog.csdn.net/jipang6225/article/details/79975312
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
⑶ Python 怎麼對列表中元素排序
排序方法有兩個。
sort()
用法:list.sort()。直接對list操作排序。
sorted()
用法:sorted(list)。有返回值,返回排序後的列表
⑷ Python對列表排序函數sort()和reverse()的講解
列表中的數據種類很多,有字元串,有整型,有其他列表的嵌套,還有更多的數據類型,這些數據在列表中往往是錯亂的,沒有一定的邏輯關系,但是我們在使用列表的時候往往需要按照一定的邏輯關系進行調用或檢索。下面就來看看 列表是如何排序和翻轉的 ,所謂翻轉也就是把既定列表倒序排列。
返回結果:
從上面的返回結果可以看出來,sort()函數如果遇到字元串是按照首字母順序進行排列的,如果遇到浮點型數據還是按照大小排列。
由上面的結果可以看出來,不同的數據類型是沒有辦法進行排列的。
這個方法是把原列表中的元素順序從左至右的重新存放,而不會對列表中的參數進行排序整理。如果需要對列表中的參數進行整理,就需要用到列表的另一種排序方式sort正序排序。
⑸ python列表排序方法
列表的sort方法就是用來進行排序的。
主要就是兩個參數,key,reverse
先說reverse,這個很簡單,就是指出是否進行倒序排序:一般情況下,1排在2的前面,而倒序則相反。
key參數:一般它是一個函數,它接受列表中每一個元素,返回一個可用用於比較的值。
s=[1,2,3,4,5]
s.sort(key=lambda _: _**2%7)
print(s)
輸出的是:[1, 3, 4, 2, 5]
如果看不懂lambda表達式,可以看這一段等價的寫法:
def myfn(x):
....return (x * x) % 7
s=[1,2,3,4,5]
s.sort(key=myfn)
print(s)
輸出的結果是一樣的。
key使用的函數可以是自定義函數也可以pytho內置的函數,或者是某個類或者實例的方法,只要它能接受一個參數,返回一個可比較的值即可。比如這樣:
s=[[1,2,4],[3,3,5],[1,1,1],[5,7,9]]
s.sort(key=max) # 直接使用max函數作為排序依據
print(s)
[[1, 1, 1], [1, 2, 4], [3, 3, 5], [5, 7, 9]]
⑹ Python學習小技巧之列表項的排序
Python學習小技巧之列表項的排序
本文介紹的是關於Python列表項排序的相關內容,分享出來供大家參考學習,下面來看看詳細的介紹:
典型代碼1:
data_list = [6, 9, 1, 3, 0, 10, 100, -100]
data_list.sort()
print(data_list)
輸出1:
[-100, 0, 1, 3, 6, 9, 10, 100]
典型代碼2:
data_list = [6, 9, 1, 3, 0, 10, 100, -100]
data_list_ = sorted(data_list)
print(data_list)
print(data_list_)
輸出2:
[6, 9, 1, 3, 0, 10, 100, -100]
[-100, 0, 1, 3, 6, 9, 10, 100]
應用場景
需要對列表中的項進行排序時使用。其中典型代碼1是使用的列表自身的一個排序方法sort,這個方法自動按照升序排序,並且是原地排序,被排序的列表本身會被修改;典型代碼2是調用的內置函數sort,會產生一個新的經過排序後的列表對象,原列表不受影響。這兩種方式接受的參數幾乎是一樣的,他們都接受一個key參數,這個參數用來指定用對象的哪一部分為排序的依據:
data_list = [(0, 100), (77, 34), (55, 97)]
data_list.sort(key=lambda x: x[1]) # 我們想要基於列表項的第二個數進行排序
print(data_list)
>>> [(77, 34), (55, 97), (0, 100)]
另外一個經常使用的參數是reverse,用來指定是否按照倒序排序,默認為False:
data_list = [(0, 100), (77, 34), (55, 97)]
data_list.sort(key=lambda x: x[1], reverse=True) # 我們想要基於列表項的第二個數進行排序,並倒序
print(data_list)
>>> [(0, 100), (55, 97), (77, 34)]
帶來的好處
1. 內置的排序方法,執行效率高,表達能力強,使代碼更加緊湊,已讀
2. 靈活的參數,用於指定排序的基準,比在類似於java的語言中需要寫一個comparator要方便很多
其它說明
1. sorted內置函數比列表的sort方法要適用范圍更廣泛,它可以對除列表之外的可迭代數據結構進行排序;
2. list內置的sort方法,屬於原地排序,理論上能夠節省內存的消耗;
總結
好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助
⑺ python sort()用法
Python中的sort()方法用於數組排序,下面以實例形式對此加以詳細說明:
一、基本形式
列表有自己的sort方法,其對列表進行原址排序,既然是原址排序,那顯然元組不可能擁有這種方法,因為元組是不可修改的。
x=[4,6,2,1,7,9]x.sort()
printx#[1,2,4,6,7,9]
如果需要一個排序好的副本,同時保持原有列表不變,怎麼實現呢
x=[4,6,2,1,7,9]
y=x[:]
y.sort()
printy#[1,2,4,6,7,9]
printx#[4,6,2,1,7,9]
注意:y = x[:] 通過分片操作將列表x的元素全部拷貝給y,如果簡單的把x賦值給y:y = x,y和x還是指向同一個列表,並沒有產生新的副本。
另一種獲取已排序的列表副本的方法是使用sorted函數:
x=[4,6,2,1,7,9]
y=sorted(x)
printy#[1,2,4,6,7,9]
printx#[4,6,2,1,7,9]
sorted返回一個有序的副本,並且類型總是列表,如下:
printsorted('Python')#['P','h','n','o','t','y']
二、自定義比較函數
可以定義自己的比較函數,然後通過參數傳遞給sort方法:
defcomp(x,y):
ifx<y:
return1
elifx>y:
return-1
else:
return0
nums=[3,2,8,0,1]
nums.sort(comp)
printnums#降序排序[8,3,2,1,0]
nums.sort(cmp)#調用內建函數cmp,升序排序
printnums#降序排序[0,1,2,3,8]
三、可選參數
sort方法還有兩個可選參數:key和reverse
1、key在使用時必須提供一個排序過程總調用的函數:
x=['mmm','mm','mm','m']
x.sort(key=len)
printx#['m','mm','mm','mmm']
2、reverse實現降序排序,需要提供一個布爾值:
y=[3,2,8,0,1]
y.sort(reverse=True)
printy#[8,3,2,1,0]
⑻ python怎麼實現數組排序
#合成一個字典
ab=dict(zip(a,b))
#根據字典的鍵進行排序(也就是第一個列表);也可以根據第二個列表進行排序。
#具體是升序還是降序,自己挑著來。
ab_order=sorted(ab.items(),key=lambdax:x[0],reverse=
False)
⑼ 深入理解python中的排序sort
進行一個簡單的升序排列直接調用sorted()函數,函數將會返回一個排序後的列表:
sorted函數不會改變原有的list,而是返回一個新的排好序的list
如果你想使用就地排序,也就是改變原list的內容,那麼可以使用list.sort()的方法,這個方法的返回值是None。
另一個區別是,list.sort()方法只是list也就是列表類型的方法,只可以在列表類型上調用。而sorted方法則是可以接受任何可迭代對象。
list.sort()和sorted()函數都有一個key參數,可以用來指定一個函數來確定排序的一個優先順序。比如,這個例子就是根據大小寫的優先順序進行排序:
key參數的值應該是一個函數,這個函數接受一個參數然後返回以一個key,這個key就被用作進行排序。這個方法很高效,因為對於每一個輸入的記錄只需要調用一次key函數。
一個常用的場景就是當我們需要對一個復雜對象的某些屬性進行排序時:
再如:
前面我們看到的利用key-function來自定義排序,同時Python也可以通過operator庫來自定義排序,而且通常這種方法更好理解並且效率更高。
operator庫提供了 itemgetter(), attrgetter(), and a methodcaller()三個函數
同時還支持多層排序
list.sort()和sorted()都有一個boolean類型的reverse參數,可以用來指定升序和降序排列,默認為false,也就是升序排序,如果需要降序排列,則需將reverse參數指定為true。
排序的穩定性指,有相同key值的多個記錄進行排序之後,原始的前後關系保持不變
我們可以看到python中的排序是穩定的。
我們可以利用這個穩定的特性來進行一些復雜的排序步驟,比如,我們將學生的數據先按成績降序然後年齡升序。當排序是穩定的時候,我們可以先將年齡升序,再將成績降序會得到相同的結果。
傳統的DSU(Decorate-Sort-Undecorate)的排序方法主要有三個步驟:
因為元組是按字典序比較的,比較完grade之後,會繼續比較i。
添加index的i值不是必須的,但是添加i值有以下好處:
現在python3提供了key-function,所以DSU方法已經不常用了
python2.x版本中,是利用cmp參數自定義排序。
python3.x已經將這個方法移除了,但是我們還是有必要了解一下cmp參數
cmp參數的使用方法就是指定一個函數,自定義排序的規則,和java等其他語言很類似
也可以反序排列
python3.x中可以用如下方式: