**如下:
import random
l1 =
[random.randint(-20
,20)for i in
range(10
)]length =
len(l1)
for i in
range
(length)
: count =
0for j in
range
(length-i-1)
:if l1[j]
> l1[j+1]
: l1[j]
,l1[j+1]
= l1[j+1]
,l1[j]
count +=
1#交換次數
if count ==0:
#如果在一趟比較中,沒有發生交換,則說明順序已經排好了,後邊不需在比較排序
break
print
(l1)
基本實現**如下:
import random
l1 =
[random.randint(-20
,20)for i in
range(10
)]length =
len(l1)
print
(l1)
for i in
range
(length-1)
: maxindex=i
for j in
range
(i+1
,length)
:if l1[j]
> l1[maxindex]
: maxindex = j
if i != maxindex:
l1[maxindex]
,l1[i]
= l1[i]
,l1[maxindex]
print
(l1)
優化一:二元選擇排序,同時固定左邊最大值和右邊最小值,減少迭代元素的次數
**如下:
import random
l1 =
[random.randint(-20
,20)for i in
range(9
)]length =
len(l1)
print
(l1)
for i in
range
(length//2)
:#一次固定兩個數,所以迴圈次數減半
maxindex=i
minindex=i
for j in
range
(i+1
,length-i)
:#每次迴圈在兩邊各固定乙個值,下次迴圈就只能兩邊各減去乙個數
if l1[j]
> l1[maxindex]
: maxindex = j #在一次迴圈中同時找到最大值和最小值
if l1[j]
< l1[minindex]
: minindex = j
if maxindex != i:
l1[maxindex]
,l1[i]
= l1[i]
,l1[maxindex]
#最大值放左邊
if minindex == i:
minindex = maxindex#如果最大值剛好最小值交換了,那麼最小值得索引就是最大值的索引
if minindex != length-
1-i:
l1[minindex]
,l1[length-
1-i]
= l1[length-
1-i]
,l1[minindex]
#最小值放右邊。
print
(l1)
優化二:如果最大索引的值和最小索引的值相同,那麼要麼取值到最後了,要麼剩下所有值都一樣了。[1, 1, 1, 1, 1, 1, 1, 1, 2] 這種情況,找到的最小值索引是-2,最大值索引8,上面的**會交換2次,最小值兩個1交換是無用功,所以,增加乙個判斷。
**如下:
import random
l1 =
[random.randint(-20
,20)for i in
range(9
)]length =
len(l1)
print
(l1)
for i in
range
(length//2)
:#一次固定兩個數,所以迴圈次數減半
maxindex=i
minindex=i
for j in
range
(i+1
,length-i)
:#每次迴圈在兩邊各固定乙個值,下次迴圈就只能兩邊各減去乙個數
if l1[j]
> l1[maxindex]
: maxindex = j #在一次迴圈中同時找到最大值和最小值
if l1[j]
< l1[minindex]
: minindex = j
if l1[minindex]
== l1[maxindex]
:#如果最大索引的值和最小索引的值相同,那麼要麼取值到最後了,要麼剩下所有值都一樣了
break
if maxindex != i:#如果最大值索引和要換位置的索引一樣,則不需交換。
l1[maxindex]
,l1[i]
= l1[i]
,l1[maxindex]
#最大值放左邊
if minindex == i:
minindex = maxindex#如果最大值剛好最小值交換了,那麼最小值得索引就是最大值的索引
if minindex != length-
1-i and l1[minindex]
!= l1[length-
1-i]
:#如果最小值和右邊值一樣,則不需交換
l1[minindex]
,l1[length-
1-i]
= l1[length-
1-i]
,l1[minindex]
#最小值放右邊。
print
(l1)
冒泡法與簡單選擇排序相比: 氣泡排序and簡單選擇排序
在第一趟排序中,從第乙個元素開始,掃瞄整個待排序元素序列,若相鄰的兩個元素逆序,則交換位置。直到最後乙個元素,此時,最後乙個元素必為最大的元素。第二趟排序,依然從第乙個元素開始掃瞄直到倒數第二個元素。第三趟排序,從第乙個掃瞄到倒數第三個。直到只剩乙個元素需要掃瞄。程式如下 includeint ma...
簡單選擇排序和氣泡排序
關於排序,氣泡排序和簡單選擇排序應該是最簡單的排序了 排序過程 從小到大排序比較第乙個與第二個數,若a 0 a 1 則交換 然後比較第二個數和第三個數 以此類推,直到第n 1個數和第n 個數比較為止 第一趟氣泡排序結束 陣列中最大的數被排在了最後 對前n 1個個數進行氣泡排序,結果是次大的數排在第n...
插入排序法與簡單選擇排序法
written by robert wang in southwest university of science and technology.插入排序法 插入排序就像玩撲克一樣,先找到第一張牌,拿起第二張牌的時候就要進行比較,如果比第一張小,則交換,反之,放在右邊不做處理。我們用程式來解決的話,...