程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python每日一練——第9天:選擇排序【含動圖展示】

編輯:Python

前言

Python每日一練來啦,本文已收錄於:《Python每日一練》專欄

此專欄目的在於,幫忙學習Python的小白提高編程能力,訓練邏輯思維,每周持續更新中,歡迎免費訂閱!!!


文章目錄

  • 1. 算法描述
  • 2. 算法分析
  • 3. 動圖展示
  • 4. 代碼實現
  • 5. 時間復雜度分析
  • 6. 如何讓刷題變得更加高效呢?


1. 算法描述

選擇排序(Selection sort)是一種簡單直觀的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然後,再從剩余未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。

2. 算法分析

選擇排序的主要優點與數據移動有關。如果某個元素位於正確的最終位置上,則它不會被移動。選擇排序每次交換一對元素,它們當中至少有一個將被移到其最終位置上,因此對n個元素的表進行排序總共進行至多n-1次交換。在所有的完全依靠交換去移動元素的排序方法中,選擇排序屬於非常好的一種。

3. 動圖展示

看明白了運行流程,我們再來看看動圖實現

4. 代碼實現

實現代碼:

import random
# random庫隨機生成列表
sec_list = [random.randint(1, 100) for i in range(8)]
# 獲取當前列表長度
length = len(sec_list)
print("未排序的列表:" % sec_list)
# 外層循環
for i in range(length - 1):
min_index = i
# 內層循環從認為最小的那個數後一位開始,一直到結束
for j in range(i + 1, length):
# 如果最小的元素大於後面的元素
if sec_list[min_index] > sec_list[j]:
# 重新賦值最小元素
min_index = j
# 當內層循環執行一整輪後交換位置
sec_list[min_index], sec_list[i] = sec_list[i], sec_list[min_index]
print("第%s輪排好序的是:%s" % (i + 1, sec_list))
print("最終排好序的結果為:%s" % sec_list)

運行結果:

5. 時間復雜度分析

  • 最優時間復雜度:O(n2)
  • 最壞時間復雜度:O(n2)
  • 穩定性:不穩定(考慮升序每次選擇最大的情況)

  • 選擇排序與冒泡排序一樣,需要進行N*(N-1)/2次比較,但是只需要N次交換,當N很大時,交換次數的時間影響力更大,所以選擇排序的時間復雜度為O(N^2)

  • 雖然選擇排序與冒泡排序在時間復雜度屬於同一量級,但是毫無疑問選擇排序的效率更高,因為它的交換操作次數更少,而且在交換操作比比較操作的時間級大得多時,選擇排序的速度是相當快的。

6. 如何讓刷題變得更加高效呢?

1. 編程小白選手

很多剛入門編程的小白學習了基礎語法,卻不知道語法的用途,不知道如何加深映像,不知道如何提升自己,這個時候每天刷自主刷一道題就非常重要(百煉成神),可以去牛客網上的編程初學者入門訓練。該專題為編程入門級別,適合剛學完語法的小白練習,題目涉及編程基礎語法,基本結構等,每道題帶有練習模式和考試模式,可還原考試模式進行模擬,也可通過練習模式進行練習。

鏈接地址:牛客網 | 編程初學者入門訓練

2. 編程進階選手

當基礎練習完已經逐步掌握了各知識要點後,這個時候去專項練習中學習數據結構、算法基礎、計算機基礎等。先從簡單的入手,感覺上來了再做中等難度,以及較難的題目。這三樣是面試中必考的知識點,我們只有堅持每日自己去多加練習,拒絕平躺持續刷題,不斷提升自己才能沖擊令人滿意的公司。

鏈接地址:牛客網 | 專項練習

速度上號,大家一起沖擊大廠,有疑問評論區留言解答!!!


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved