排序演算法(1)插入排序的演算法分析
導語
今天,我們介紹的是排序演算法經典的一種排序演算法,這個演算法是插入排序。
相信大家都玩過紙牌。插入排序的工作方式就像許多人排序一手撲克牌。
開始時,我們的左手為空並且桌子上的牌面朝下(意味著我們不在翻開之前並不知道下一張牌是多大的)。
然後,我們每次從那些牌中選出一張牌,並把它插入到正確的位置(一般我們認為左邊的最小),我們從左到右(或從右到左)將它與已在手中的每張牌進行比較。
動態圖演示如下:
演算法分析
對於插入排序,我們將虛擬碼的過程命名為INSERTION-SORT
其中
- 引數是A[1..N],為長度n的一個需要排序的序列。
- A.length表示陣列A中元素的數量
該演算法在陣列A中重排這些數,在任何時候,最多隻有其中的常數個數字儲存在陣列外面。
等INSERTION-SORT結束時,輸入陣列A包含排序好的輸出序列。
演算法虛擬碼
INSERTION-SORT(A)
1 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 | ||
key = A[j] | ||
i = j - 1 | ||
while i > 0 and A[i] > key | ||
A[i+1] = A[i] | ||
i = i - 1 | ||
A[i+1]=key |
該演算法的執行時間是執行每條語句的執行時間之和。基於此,我們可以計算在具有n個值輸入上INSERTION-SORT(A)的執行時間T[n],我們將代價與次數列對應元素之積求和,得
最好情況下:
對於給定的n個需要排序的,若輸入已排序,則出現最佳情況。這個時候,對於j=2,3,….,n,可以發現,當i取初值j-1時,有
A[i]≤key 。從而對j=2,3,…,n有tj=1 ,也就是說只需要比較一次。我估計說到這裡,有些人看不懂,我就簡單的說吧:
假設現在你左手中的牌都是已經排好序了的,而且是從小到大排序,現在你手上拿了一張牌,比你左手上的牌最右邊(即是你手中牌中最大)還要大,那麼你一定要保證牌是從小到大的排序,必然會把牌之間放在你牌的最右邊。而這個過程,你只是和你本來有的牌的最大一張比較了一次。
所以最好的情況下的時間複雜度
Tn 為:
T(n)=c1n+c2(n−1)+c3(n−1)+c4(n−1)+c7(n−1)=(c1+c2+c3+c4+c7)n−(c1+c2+c3+c4)
即T(n)=an+b 其中
a 和b 依賴於語句代價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.希爾排序)
結束 縮小 移動 個數 數據 空間 分析 過程 只有一個 一、插入排序的基本思想 從初始有序的子集合開始,不斷地把新的數據元素插入到已排列有序子集合的合適位置上,使子集合中數據元素的個數不斷增多,當子集合等於集合時,插入排序算法結束。常用的 插入排序算法有直接插入排