1. 程式人生 > >排序演算法(1)插入排序的演算法分析

排序演算法(1)插入排序的演算法分析

導語

   今天,我們介紹的是排序演算法經典的一種排序演算法,這個演算法是插入排序。

相信大家都玩過紙牌。插入排序的工作方式就像許多人排序一手撲克牌。

開始時,我們的左手為空並且桌子上的牌面朝下(意味著我們不在翻開之前並不知道下一張牌是多大的)。

然後,我們每次從那些牌中選出一張牌,並把它插入到正確的位置(一般我們認為左邊的最小),我們從左到右(或從右到左)將它與已在手中的每張牌進行比較。
這裡寫圖片描述

動態圖演示如下:

這裡寫圖片描述

演算法分析

對於插入排序,我們將虛擬碼的過程命名為INSERTION-SORT
其中

  1. 引數是A[1..N],為長度n的一個需要排序的序列。
  2. A.length表示陣列A中元素的數量

該演算法在陣列A中重排這些數,在任何時候,最多隻有其中的常數個數字儲存在陣列外面。

等INSERTION-SORT結束時,輸入陣列A包含排序好的輸出序列。

演算法虛擬碼

INSERTION-SORT(A1   for j=2 to A.length
2       key = A[j]
3       //Insert A[j] into the sorted sequence A[1..j-1]
4       i = j - 1
5       while i > 0 and A[i] > key
6           A[i+1] = A[i]
7           i = i - 1
8 A[i+1]=key

圖示分析

這裡寫圖片描述

演算法複雜度分析

INSERTION-SORT(A) 代價 次數
for j=2 to A.length c1 n
key = A[j] c2 n1
i = j - 1 c3 n1
while i > 0 and A[i] > key c4 nj=2tj
A[i+1] = A[i] c5 nj=2(tj1)
i = i - 1 c6 nj=2(tj1)
A[i+1]=key c
7
n1

該演算法的執行時間是執行每條語句的執行時間之和。基於此,我們可以計算在具有n個值輸入上INSERTION-SORT(A)的執行時間T[n],我們將代價次數列對應元素之積求和,得

T(n)=c1n+c2(n1)+c3(n1)+c4j=2ntj+c5j=2n(tj1)+c6j=2n(tj1)+c7(n1)

最好情況下:

對於給定的n個需要排序的,若輸入已排序,則出現最佳情況。這個時候,對於j=2,3,….,n,可以發現,當i取初值j-1時,有A[i]key。從而對j=2,3,…,n有tj=1,也就是說只需要比較一次。

我估計說到這裡,有些人看不懂,我就簡單的說吧:

假設現在你左手中的牌都是已經排好序了的,而且是從小到大排序,現在你手上拿了一張牌,比你左手上的牌最右邊(即是你手中牌中最大)還要大,那麼你一定要保證牌是從小到大的排序,必然會把牌之間放在你牌的最右邊。而這個過程,你只是和你本來有的牌的最大一張比較了一次。

所以最好的情況下的時間複雜度Tn為:

T(n)=c1n+c2(n1)+c3(n1)+c4(n1)+c7(n1)=(c1+c2+c3+c4+c7)n(c1+c2+c3+c4)
T(n)=an+b

其中ab依賴於語句代價ci

我們可以得出一個結論:

在最好情況下,插入排序的時間複雜度在O(n),即上完成排序。

最壞情況下:

若輸入陣列已方向排序,即按照遞減排序排好了序,則導致最壞情況。我們必須把每個元素A[j]與整個已排序子陣列A[1..j-1]中的每個元素都要進行比較,所以對j=2,3,…,n,有tj=j

我估計有人問為什麼tj=j,那麼我就這樣告訴你吧:

tj是while語句進行比較語句的執行的次數,最後一次是進行i>0的判斷,所以A[1..j-1]與A[j]實際上進行了j-1次比較,那麼為什麼進行j-1次比較呢,我們這麼想,j代表我要加入第幾張牌,我就以j=3來說,我即將加入第3張牌進入我左手的牌中(左手有兩張牌,已經升序排列了好了),而這個牌比前面2個都要小,那麼我是需要和比較兩次才知道的,所以一共比較j-1次。

值得注意的是,這時候的

j=2

相關推薦

排序演算法1插入排序演算法分析

導語 今天,我們介紹的是排序演算法經典的一種排序演算法,這個演算法是插入排序。 相信大家都玩過紙牌。插入排序的工作方式就像許多人排序一手撲克牌。 開始時,我們的左手為空並且桌子上的牌面朝下(意味著我們不在翻開之前並不知道下一張牌是多大的)

程式猿必懂的排序方法1--插入排序

直接插入排序--基本思想  在要排序的一組數中,假設前面的(n-1)[n>=2] 個數已經是排好序的。現在要把第n個數插入到前面的有序數中,使得n個數也是排好序的。如此反覆迴圈,直到全部排好順序。 上程式碼 : /** * 插入排序 * 平均O(n^2),最好O(

經典排序演算法1——氣泡排序演算法詳解

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

從零開始學演算法插入排序

從零開始學演算法(三)插入排序 插入排序 演算法介紹 演算法原理 演算法簡單記憶說明 演算法複雜度和穩定性 程式碼實現 插入排序 程式碼是Javascript語言寫的(幾乎是虛擬碼) 演算

java排序演算法------插入排序

插入排序 直接插入排序基本思想: 每一步將一個待排序的記錄,插入到前面已經排好序的有序序列中去,直到插完所有元素為止。 public static void sort(int[] arr) { int i; int t; for (int j

java 實現 常見排序演算法 插入排序

大家好,我是烤鴨:        今天分享一下基礎排序演算法之直接插入排序。   1.     直接插入排序: 原理:假設前面的數為有序數列,然後有序數列與無序數列的每個數比較,我們可

排序演算法——插入排序

插入排序(英語:Insertion Sort)是一種簡單直觀的排序演算法。通過對未排序的資料執行逐個插入至合適的位置而完成排序工作。 插入排序演算法的運作如下: 1.首先對陣列的前兩個資料進行從小到大的排序; 2.接著將第3個數據與排好序的兩個資料進行比較,將第三個資料插入合適的位置;

java算法----排序----1插入排序

pan 排序 string ack src [] AR style inf 1 package log; 2 3 public class Test4 { 4 5 /** 6 * java算法---插入排序 7 * 8

演算法1---什麼是演算法

《演算法導論》 MIT演算法導論課程 大綱 演算法是關於程式效能的一種技術,關注的是如何讓計算機更快的做事 演算法的價值: (1)讓不可能成為可能,演算法總是試圖解決未解決的問題 (2)程

排序演算法1:氣泡排序插入排序

1.1 氣泡排序 氣泡排序需要多次遍歷列表。它比較相鄰的項並交換那些無序的項。每次遍歷列表將下一個最大的值放在其正確的位置。實質上,每個項“冒泡”到它所屬的位置。 用python寫交換操作時,與大多數程式語言略有不同(需要臨時儲存位置),python可以執行

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

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

排序演算法3——圖解直接插入排序以及折半二分插入排序及其實現

排序演算法1——圖解氣泡排序及其實現(三種方法,基於模板及函式指標) 排序演算法2——圖解簡單選擇排序及其實現 排序演算法3——圖解直接插入排序以及折半(二分)插入排序及其實現 排序演算法4——圖解希爾排序及其實現 排序演算法5——圖解堆排序及其實現 排序演算法6——圖解歸併排序及其遞迴與非

資料結構與演算法分析-Java描述2-插入排序

插入排序有兩種演算法:直接插入排序和希爾排序 直接插入排序  原理:插入即表示將一個新的資料插入到一個有序陣列中,並繼續保持有序。 該排序演算法的外部迴圈為遍歷全部元素,內部迴圈為遍歷當前外部迴圈記錄元素的前面所有數字。 public static void inse

常用排序演算法總結1-- 比較排序

我們通常所說的排序演算法往往指的是內部排序演算法,即資料記錄在記憶體中進行排序。 排序演算法大體可分為兩種: 一種是比較排序,時間複雜度O(nlogn) ~ O(n^2),主要有:氣泡排序,選擇排序,插入排序,歸併排序,堆排序,快速排序等。 另一種是非比較排序,時間複雜度可以達到O(n),

排序演算法氣泡排序,簡單選擇排序,直接插入排序,希爾排序

氣泡排序,簡單選擇排序,直接插入排序是三種複雜度為O(n2)的演算法,希爾排序在特殊增量序列的時候可以獲得複雜度為O(n3/2) 氣泡排序 1、最簡單的排序實現 這裡把每個數和這個數之後的每個數比較,大於就交換位置。 缺點:多出了很多次沒有用的交

資料結構14——插入排序、交換排序、選擇排序、歸併排序和基數排序演算法的比較

在排序過程中依據不同原則對內部排序方法進行分類,可大致分為插入排序、交換排序、選擇排序、歸併排序和基數排序等五類 插入排序 直接插入排序 直接插入排序市一中最簡單的排序方法,它的基本操作是將一個記錄插入到已排好序的有序表中,從而得到一

排序演算法1:簡單選擇排序和堆排序

1.簡單選擇排序 (1)本質:每一趟從給定待排序序列A[ 1......n ] ,選擇出第i小元素,並和A[i]交換。 程式碼: /************************************************* 演算法:簡單選擇排序(升序) 時間

第16周專案1 驗證演算法7歸併排序

問題: /* * Copyright (c)2015,煙臺大學計算機與控制工程學院 * All rights reserved. * 檔名稱:專案1-7.cbp * 作 者:張芸嘉 * 完成日期:2015年12月18日 * 版 本 號

第16周專案1 驗證演算法6排序

問題: /* * Copyright (c)2015,煙臺大學計算機與控制工程學院 * All rights reserved. * 檔名稱:專案1-6.cbp * 作 者:張芸嘉 *

數據結構四十四插入排序1.直接插入排序 2.希爾排序

結束 縮小 移動 個數 數據 空間 分析 過程 只有一個   一、插入排序的基本思想   從初始有序的子集合開始,不斷地把新的數據元素插入到已排列有序子集合的合適位置上,使子集合中數據元素的個數不斷增多,當子集合等於集合時,插入排序算法結束。常用的 插入排序算法有直接插入排