目錄
一.冒泡排序
1.1概念:
1.2原理:
1.3簡單示例講解:
二.遞歸排序
1.1概念:
1.2原理:
1.3簡單示例講解:
一.冒泡排序
1.1概念:
冒泡排序是一種最基礎的交換排序。
通過反復交換相鄰兩個元素的位置,使得每一輪循環都能將未排序的部分中的最大元素移動到數組的末尾。
因為越小的元素會經由交換像是氣泡一樣慢慢浮到數組的頂端,所以叫做冒泡排序。
1.2原理:
從數組的第一個元素開始,依次比較相鄰的兩個元素大小。
如果前面的元素比后面的元素大,就交換它們的位置,這樣一輪比較下來,最大的元素就被交換到數組的最后一個位置了。
接下來,重復這個過程,有n個元素,就要重復n-1次,直到所有元素都被排序為止。
1.3簡單示例講解:
#定義一個數列,作為理解。ls=[9,5,2,7,6,4,1]
ls = [9,5,2,7,6,4,1]
for i in range(0,len(ls)-1):for j in rang(0,len(ls)-1):if ls[j] >= ls[j+1]: ls[j],ls[j+1] = ls[j+1],ls[j]
print(ls)#函數(作為初學者,要學會習慣用函數來進行分治解決)def bubble_sort(ls):for i in range(len(ls)):for j in range(len(ls)):if ls[j] >= ls[j+1]:ls[j],ls[j+1] = ls[j+1],ls[j]return ls
首先,要獲取數列的長度,可以用len()函數來解決,之后通過兩個循環嵌套實現冒泡排序。外層循環用來遍歷整個數組,內層循環則用來處理未排序的部分。
內循環中,比較兩個相鄰的元素大小,如果前一個元素比后一個元素大,那么就交換兩個元素的位置。這樣,每一輪遍歷就能將未排序部分中的最大元素交換到數組的末尾。
達成排序的目的。
二.遞歸排序
1.1概念:
這里講解的是一種最基礎的遞歸排序。
遞歸,簡而言之,就是函數自己調用自己。遞歸作為一種算法在程序設計語言中廣泛應用。
遞歸是一個過程或函數在其定義或者說明中有直接或者間接調用自身的一種方法,通常把一個大的復雜的問題層層轉化為一個與原問題相似的規模較小的問題來求解。
遞歸算法只需要少量的程序就能描述出解題過程中所需要的多次重復計算,大大的減少了程序的代碼量。
1.2原理:
選擇一個值作為key,再將key和其他數一一比較,比它大的放在原來的位置,比它小的數則和key互換位置,到最后實現數據大小的排序。
在這個問題中,我們可以將第一個元素作為key。
1.3簡單示例講解:
#定義一個函數,有三個參數,vect:待排序的序列,first:當前處理的起始位置,last:當前處理的結束位置(不包含)。def resort(vect,first,last):if first == last: #函數首先判斷first=last,即起始位置等于結束位置,就輸出當前列表print(vect)else:for i in range(first,last):Min = min (vect[first:last])index = vect.index(Min)#找到first到last范圍內的最小值Min,并找到其索引indexvect[first],vect[index] = vect[index],vect[first]#將第first個元素和最小值Min交換位置resort(vect,first+1,last)#調用resort函數,起始位置+1繼續排列return vectvect = [5,8,10,20,9,7,1]
resort(vect,0,len(vect))
在上述代碼中,我們是直接在原來的數列上進行排序,存在一些問題,可以使用copy.deepcopy()來創建vect新副本,以此避免修改原始列表,以下是修正后的代碼:
import copydef resort(vect, first, last):if first == last:print(vect)else:for i in range(first, last):new_vect = copy.deepcopy(vect) # 創建副本Min = min(new_vect[first:last])index = new_vect.index(Min)new_vect[first], new_vect[index] = new_vect[index], new_vect[first]resort(new_vect, first+1, last)# 測試代碼
vect = [5, 8, 10, 20, 9, 7, 1]
resort(vect, 0, len(vect))