1. 程式人生 > >演算法學習(1):排序演算法-插入排序及python實現

演算法學習(1):排序演算法-插入排序及python實現

前言

插入排序應該是最容易想到的排序演算法,其核心思想是:將待排序的序列看成兩部分,以某一個元素為界,左邊的是排好序的序列,右邊是待排序的序列,每次讀取邊界上的一個元素,然後將它跟排序好的序列中的元素一個一個對比,然後排好序的元素依次挪出個空位,然後將這個元素插入到合適的位置,一直迴圈到序列結束。

插入排序很常見,比如:玩撲克牌時,抓牌的過程就是一個插入排序,每抓到一張牌,就將這張牌插入到手裡排好序的牌中。怎麼個插入法兒呢?比如你手裡的牌是3、6、9,現在你抓到了一張8,你會先跟3比較,8比3大,把3往後挪一個位兒;再跟6比,8比6大,6也往後挪一個位兒;再跟9比,8比9小,9就不挪了,然後就把8放在挪出的空位上來。迴圈這個過程,手裡的牌就是有序的。同樣的例子還有按身高站隊,也是一個一個比,然後一個一個挪位子,迴圈這個過程。

正文

下面的程式碼是python語言實現的插入排序演算法

a=[234,2345,6,543,2346,34,6,2,56,146,776]
print(a)

for i in range(1,len(a)):
    j = i-1
    tmp = a[i]
    while j>=0 and a[j]>tmp:
        a[j + 1] = a[j]
        j-=1
    a[j+1] = tmp

print(a)

總結

插入排序的時間複雜度是:O(n^2)
插入排序的空間複雜度是:O(n)

插入排序的好壞極大地依賴於序列原始狀態,如果起始無序,則效率很低。不適合大規模資料集的排序問題。

相關推薦

演算法學習1排序演算法-插入排序python實現

前言 插入排序應該是最容易想到的排序演算法,其核心思想是:將待排序的序列看成兩部分,以某一個元素為界,左邊的是排好序的序列,右邊是待排序的序列,每次讀取邊界上的一個元素,然後將它跟排序好的序列中的元素一個一個對比,然後排好序的元素依次挪出個空位,然後將這個元素

沒事兒就學習1AVL樹插入

       AVL樹是最先發明的自平衡二叉樹,這是個啥樹呢,為啥要平衡呢?我們可以在分析其原理的時候慢慢用C++實現它一下。       故名思意,自平衡二叉樹是一種可以實現自我平衡的二叉樹,分開看是自動化的、平衡的、二叉樹。資料結構中的二叉樹是一種特殊的樹,因為其限定了樹

機器學習1K-MEANS聚類演算法

一、聚類簡介 1.無監督問題:我們手裡沒有標籤了 2.聚類:相似的東西分到一組 3.難點:如何評估,如何調參 二、基本概念: 1.K:要得到簇的個數,需要指定K 2.質心:均值,即向量各維取平均 3.距離的度量:常用歐幾里得距離和餘弦相似度(先標準化) 4.優化目標 (1)Ci代表

演算法優化1基礎知識-凸集,單峰函式,擬凸函式與凸函式,函式凹凸性定義

本文筆記介紹我最近學習的演算法優化的基礎知識,有: 最優化問題的一般形式 約束問題的分類及形式 優化問題的分類 單峰函式(Unimodal function)的定義 擬凸函式(Quasiconvex function)的定義

雙目視覺演算法學習雙目定標

老闆新安排的任務,需要在FPGA上實現雙目演算法,所以最近開始學習這塊,雙目演算法主要分成3個部分:定標、校正、匹配。其實定標是最基礎的部分,為後面的程式提供初始資料,這一塊的資料主要參考了影象獲取與單目定標和攝像機標定和立體標定,本文主要是我在雙目定標的步驟以及我對此的理

KF演算法學習演算法原理與推導

       學習過程中接觸到了卡爾曼濾波,因為自己的數學渣屬性,特地把自己的推導過程記錄下來以加深理解,雖然有重複造輪子的嫌疑。。        推導公式過多,圖方便自己用的office寫的文件,後來發現打算上傳到部落格上時很無能為力。。。沒辦法只能截圖上傳圖片了,文章末

ArcGIS API for JavaScript學習1第一個地圖

樣式表 參數 資源 charset 底層 arcgis 順序 api navi 1.簡介 ArcGIS API for JavaScript跟隨ArcGIS 9.3同時發布,是ESRI根據JavaScript技術實現的調用ArcGIS Server REST API接口的一

facets學習1什麽是facets

遺失 air 不同的 無縫切換 over 快速 後來 樣式 觀察 ML 數據集可以包含數億個數據點,每個數據點由數百(甚至數千)的特征組成,幾乎不可能以直觀的方式了解整個數據集。為幫助理解、分析和調試 ML 數據集,谷歌開源了 Facets,一款可視化工具。 Facets

C++學習1最大子段和多種解法

多少 問題: code namespace 數據 組成 amp using () 問題:給定由n個數(可能為負數)組成的序列a1,a2,a3,...,an,求該序列子段和的最大值。 第一種解法:(最容易考慮的方法,將所有的子段一一相加,然後比較) 1 #include&

Netty學習1Channel的概念

1. Channel Channel是Netty的核心概念之一,它是Netty網路通訊的主體,由它負責同對端進行網路通訊、註冊和資料操作等功能。 1.1 工作原理 如上圖所示: 一旦使用者端連線成功,將新建一個channel同該使用者端進行繫結 channel從EventL

ADB 學習1adb devices 命令

一、前言         關於環境搭建問題,這裡就不在寫了,之前在上一篇 monkey 環境搭建中,寫的也比較詳細,點選傳送門         因為monkey這個工具在執行時就是通過adb這個命令來與我們的

Jenkins 學習1Windows系統下安裝

一、jenkins是什麼?         還是小白,先放個連結:https://blog.csdn.net/ios_xumin/article/details/78125913   二、下載jenkins   &nbs

three.js學習1

1.three.js是: three.js是用JavaScript編寫的WebGL第三方庫。官網(www.threejs.org) 2.three.js功能: three.js 是一款執行在瀏覽器中的 3D 引擎,你可以用它建立各種三維場景,包括了攝影機、光影、材質等各種物件。 3.thre

Java虛擬機器學習1體系結構 記憶體模型

JVM記憶體區域模型 1.方法區 也稱”永久代” 、“非堆”,  它用於儲存虛擬機器載入的類資訊、常量、靜態變數、是各個執行緒共享的記憶體區域。預設最小值為16MB,最大值為64MB,可以通過-XX:PermSize 和 -XX:MaxPermSize 引數限制方法區的大小。

c++演算法模板基礎演算法模板

1.高精演算法: 加法: while(i<=a加數的位數|| i<=b加數的位數) { c[i]=a[i]+b[i]+x; x=c[i]/10; c[i]%=10; i++; } 注意:加法需要逆序儲存,因為如

MATLAB神經網路學習1單層感知器

   單層感知器由一個線性組合器和一個二值閾值元件組成。   輸入是一個N維向量 x=[x1,x2,...,xn],其中每一個分量對應一個權值wi,隱含層輸出疊加為一個標量值:                          隨後在二值閾值元件中對得到的v值進行判斷,產生二值輸出:    

計算機軟體技術基礎的學習1資料結構

本文為大三下學習《計算機軟體技術基礎》的知識點一、------------資料結構:研究非數值運算(資料元素之間的關係)的程式設計------------------------------------(1)線性表:            順序儲存和鏈式儲存         

pyCUDA教程-系列學習1GPU結構、pyCUDA、numbapro安裝HelloGPU例子

GPU結構CPU v.s. GPU CPU是被設計用來處理複雜任務的,而GPU只能做好一件事-處理百萬級的低階任務(原來是被用來生成3D圖形中的三角形),而且GPU有上千個ALU(算術邏輯單元),而CPU通常只有8個。而且很多程式大部分時間都花在GPU擅長的簡單運算上了,所

Spring學習1控制反轉IoC和依賴注入DI的詳解以及註解annotation開發入門案例

前言 以往的java學習中,我們要想得到一個物件,就把它new出來。如:Apple apple = new Apple(); 在一些複雜的系統中,一個物件A可能依賴於物件B,C等(程式碼表現為A類持有B,C類的物件作為A類的屬性)。以往來說,我們想要使用B,

OpenFace學習1安裝配置人臉比對

前言 前幾天在網上看到了openface(連結),覺得挺有趣就下載配置了一下,稍微修改了一下跑了個demo,效果還是很不錯的。這裡分享下安裝配置的過程以及demo。 簡介 環境搭建 我只是在筆記本上搭建了環境所以涉及到GPU的CUDA驅動的部