1. 程式人生 > 程式設計 >Python要如何實現列表排序的幾種方法

Python要如何實現列表排序的幾種方法

排序,是許多程式語言中經常出現的問題。同樣的,在Python中,如何是實現排序呢?(以下排序都是基於列表來實現)

一、使用Python內建函式進行排序

Python中擁有內建函式實現排序,可以直接呼叫它們實現排序功能

Python 列表有一個內建的 list.sort() 方法可以直接修改列表。還有一個 sorted() 內建函式,它會從一個可迭代物件構建一個新的排序列表。

1.sort()函式:

list.sort(cmp=None,key=None,reverse=False)

其中引數的含義是:

cmp -- 可選引數,如果指定了該引數會使用該引數的方法進行排序。

key -- 主要是用來進行比較的元素,只有一個引數,具體的函式的引數就是取自於可迭代物件中,指定可迭代物件中的一個元素來進行排序。

reverse -- 排序規則,reverse = True 降序, reverse = False 升序(預設)。

預設輸入列表就可以排序,例如:

list=[1,2,4,5,3]
list.sort()
print(list)
>>>[1,3,5]

2.sorted()函式:

sorted(iterable,cmp=None,reverse=False)

其中:

iterable -- 可迭代物件。

cmp -- 比較的函式,這個具有兩個引數,引數的值都是從可迭代物件中取出,此函式必須遵守的規則為,大於則返回1,小於則返回-1,等於則返回0。

key -- 主要是用來進行比較的元素,只有一個引數,具體的函式的引數就是取自於可迭代物件中,指定可迭代物件中的一個元素來進行排序。

reverse -- 排序規則,reverse = True 降序 , reverse = False 升序(預設)。

同樣的,使用sorted()函式可以對列表進行排序,例如:

list=[1,3]
print(sorted(list))
>>>[1,5]

sort()和sorted()雖然相似,都可以實現排序功能,但是它們有很大的不同:

sort ()與sorted()區別:

sort() 是應用在 list 上的方法,sorted() 可以對所有可迭代的物件進行排序操作。

list 的 sort() 方法返回的是對已經存在的列表進行操作,無返回值,而內建函式 sorted() 方法返回的是一個新的 list,而不是在原來的基礎上進行的操作。

列表的翻轉(reverse)、升序(sort)、降序(sorted),按長度排列的用法

list4 = [10,10,50,20,30,60,51,10]
print(list4)
list4.reverse()               #翻轉
print(list4)
 
list4.sort()
print(list4)            #升序排列,直接對錶進行操作
 
list4.sort(reverse=True)
print(list4)            #降序排列
 
list41 = [10,10]
print(sorted(list41))        #升序排列,生成一個新表
print(list41)
 
print(sorted(list41,reverse=True)) #降序排列,從之前的列表中挑選出元素組成新的表
print(list41) 
 
list43 = ["fddg","gfdggfg","f"]  #按照長度進行排序,生成新的列表
print(sorted(list43,key=len))

二、使用常用的排序演算法進行排序

同其他高階函式一樣,Python也可以使用演算法,利用一般語句進行排序。

1.氣泡排序

  氣泡排序是最常見到的排序演算法,也是很基礎的一種排序演算法。它的實現思想是:相鄰的兩個元素進行比較,然後把較大的元素放到後面(正向排序),在一輪比較完後最大的元素就放在了最後一個位置,像魚兒在水中吐的氣泡在上升的過程中不斷變大,

def bubble_sort(list):
  count = len(list)
  for i in range(count):
    for j in range(i + 1,count):
      if list[i] > list[j]:
        list[i],list[j] = list[j],list[i]
  return list

2.選擇排序

  選擇排序的思路是:第一輪的時候,所有的元素都和第一個元素進行比較,如果比第一個元素大,就和第一個元素進行交換,在這輪比較完後,就找到了最小的元素;第二輪的時候所有的元素都和第二個元素進行比較找出第二個位置的元素,以此類推。

def selection_sort(list):
  length = len(list)
  for i in range(length - 1,-1):
    for j in range(i):
      if list[j] > list[i]:
        list[j],list[i] = list[i],list[j]
    return list

3.插入排序

  插入排序的思想是將一個數據插入到已經排好序的有序資料中,從而得到一個新的、個數加一的有序資料,演算法適用於少量資料的排序,時間複雜度為O(n^2)。 是穩定的排序方法。插入演算法把要排序的陣列分成兩部分:第一部分包含了這個陣列的所有元素,但將最後一個元素除外(讓陣列多一個空間才有插入的位置), 而第二部分就只包含這一個元素(即待插入元素)。在第一部分排序完成後,再將這個最後元素插入到已排好序的第一部分中

def insert_sort(list):
  count = len(list)
  for i in range(1,count):
    key = list[i]
    j = i - 1
    while j >= 0:
      if list[j] > key:
        list[j + 1] = list[j]
        list[j] = key
      j -= 1
  return list

4.快速排序

  快速排序的思想是:通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小, 然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。

def quick_sort(list,left,right): 
  if left >= right:
    return list
  key = lists[left]
  low = left
  high = right
  while left < right:
    while left < right and list[right] >= key:
      right -= 1
    lists[left] = lists[right]
    while left < right and list[left] <= key:
      left += 1
    list[right] = list[left]
  list[right] = key
  quick_sort(list,low,left - 1)
  quick_sort(list,left + 1,high)
  return list

lst1 = raw_input().split()  #呼叫函式
lst = [int(i) for i in lst1]
#lst = input()
quick_sort(lst,len(lst)-1)
for i in range(len(lst)):
  print lst[i],

5.希爾排序

  希爾排序是插入排序的一種。也稱縮小增量排序,是直接插入排序演算法的一種更高效的改進版本。希爾排序是非穩定排序演算法。 該方法因DL.Shell於1959年提出而得名。 希爾排序是把記錄按下標的一定增量分組,對每組使用直接插入排序演算法排序;隨著增量逐漸減少, 每組包含的關鍵詞越來越多,當增量減至1時,整個檔案恰被分成一組,演算法便終止。

def shell_sort(list):
  count = len(list)
  step = 2
  group = count / step
  while group > 0:
    for i in range(group):
      j = i + group
      while j < count:
        k = j - group
        key = list[j]
        while k >= 0:
          if list[k] > key:
            list[k + group] = list[k]
            list[k] = key
          k -= group
        j += group
    group /= step
  return list

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。