發現了乙個**可以更好的幫助理解排序的過程:點這裡檢視
保持第乙個位置不動,後面位置上的元素比前面小,則交換,換一輪,則第乙個位置上的元素就是最小的了
繼續保持第二個位置上元素不動,接著比較其後面的元素
num=[78
,54,443,32
,65,654
,234
,232
]for i in
range(1
,len
(num)):
minnum= num[i]
#預設當前num[i]為最小值
index=i#記錄最小值索引
for j in
range
(i-1,-
1,-1
):#從後往前迴圈遍歷
if num[j]
> minnum:
#如果當前值大於最小值,當前值後移,同事更新最小值索引
num[j+1]
=num[j]
index=j
else
:break
num[index]
=minnum#最後把最小值放記錄索引處
print
(num)
選擇排序
選擇排序是每次迴圈當前數字和後面的數字挨個比較,記住最小數字的索引值,最後把當前數字和最小索引的數字交換,進行下一次迴圈
list=[
200,4,
65,76,
2,3,
65,9,
54523,4
,323
,212
]for i in
range
(len
(list))
: minnum = i
for j in
range
(i+1
,len
(list))
:iflist
[j]<
list
[minnum]
: minnum=j
list
[i],
list
[minnum]
=list
[minnum]
,list
[i]print
(list
)
優化–二元選擇排序
既然每次可以找到最小值的索引,那麼同理也可以找到最大值的索引,把最小值和無序列表第乙個值交換,最大值和無序列表最後乙個值交換,這樣可以大量減少迴圈的次數
num=[4
,5,1
]for i in
range
(len
(num)//2
):#因為每次找到兩個值,所以迴圈次數減半,
#列表長度為奇數時,中間的值無需交換
maxindex =
-i-1
#增加最大值索引,預設無序列表中最後一項(使用負索引,從後往前)
minindex = i
for j in
range
(i+1
,len
(num)
-i):內層迴圈每次前後各推進乙個數放入有序序列
if num[
-j-1
]>num[maxindex]
: maxindex=
-j-1
if num[j]
: minindex=j
if num[maxindex]
== num[minindex]
:#如果最大值和最小值相等,說明列表元素都相等,無需交換--判斷特殊情況
break
if num[maxindex]
!=num[
-i-1]:
num[maxindex]
,num[
-i-1
]=num[
-i-1
],num[maxindex]
if num[
-i-1
]==num[minindex]
:#此處做了乙個判斷,如果減緩最大值時交換的物件為最小值,此時調整最小值的索引
minindex=maxindex
if minindex != i and num[minindex]
!= num[i]
:#此處增加判斷:如果索引不同但值相同,就不需要交換
num[minindex]
,num[i]
=num[i]
,num[minindex]
print
(num)
1、沒有辦法知道當前輪是否已經達到排序要求,但可以知道極值是否在目標索引位置上,遍歷次數為1,。。。n-1之和n(n-1)/2,時間複雜度為o(n²);
2、因為減少了交換次數提高了效率,所以效能上要略好於冒泡法。
選擇排序 與 插入排序
中心思想 通過一次遍歷後,將最小的元素放到 前面 以此類推 在遍歷過程中記錄位置的是下標索引 選擇排序 include using namespace std template typename t void selectsort t arr,int n swap arr i arr mininde...
演算法 插入排序與選擇排序
一 插入排序 1 直接插入排序是一種簡單的插入排序法,其基本思想是 把待排序的記錄按其關鍵碼值的大小逐個插入到一 個已經排好序的有序序列中,直到所有的記錄插入完為止,得到乙個新的有序序列 思想十分簡單,演算法實現如下 直接插入排序 越有序插入越快 將每乙個數與前面所有排好序的數字相比較,如果大了 直...
C 氣泡排序 選擇排序 與 插入排序
listlist new list region 氣泡排序 public void bubblesort for int i 0 i list.count i endregion region 選擇排序 基本思想 每一趟從待排序的資料元素中選出最小 或最大 的乙個元素,順序放在已排好序的數列的最後,...