冒泡法與簡單選擇排序比較

2021-09-18 06:55:42 字數 3299 閱讀 4598

**如下:

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.插入排序法 插入排序就像玩撲克一樣,先找到第一張牌,拿起第二張牌的時候就要進行比較,如果比第一張小,則交換,反之,放在右邊不做處理。我們用程式來解決的話,...