初探排序 插入與選擇排序與優化

2021-09-16 13:29:26 字數 2465 閱讀 6735

發現了乙個**可以更好的幫助理解排序的過程:點這裡檢視

保持第乙個位置不動,後面位置上的元素比前面小,則交換,換一輪,則第乙個位置上的元素就是最小的了

繼續保持第二個位置上元素不動,接著比較其後面的元素

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 選擇排序 基本思想 每一趟從待排序的資料元素中選出最小 或最大 的乙個元素,順序放在已排好序的數列的最後,...