排序算法系列:插入排序算法

概述

直接插入排序(Straight Insertion Sort)的基本操作是將一個記錄插入到已經排好序的有序表中,從而得到一個新的、記錄數增1的有序表。

                           – 《大話數據結構》


版權說明

著作權歸作者所有。


商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
本文作者:Coding-Naga
發表日期: 2016年3月24日
原文鏈接:http://blog.csdn.net/lemon_tree12138/article/details/50968422
來源:CSDN
很多其它內容:分類 >> 算法與數學


文件夾

  • 概述
  • 版權說明
  • 文件夾
  • 算法原理分析
  • 算法步驟
  • 邏輯實現
  • 復雜度分析
  • Ref
  • Github源代碼下載

算法原理分析

從上面的概述中我們也就能夠知道了。這里對數組進行排序的過程須要兩個序列才干完畢。
一個待排序的亂序序列。一個是已排序的有序序列。我們如今要要做的就是把亂序的元素一個一個地從亂序列中插入到有序序列中去。就像以下這樣:
這里寫圖片描寫敘述
但是,這里還是有一些不太好的地方,比較明顯地方就是我們須要額外加入一個輔助數組。

假設這個待排序數據比較大,那么可能加入輔助數組的策略就不能使用了。
這里我們不難想到,在原始數組中。有這種一個等式:總體序列 = 有序序列 + 亂序序列
也就是說我們能夠把當前序列數組一分為二,左邊為有序,右邊為亂序。
這里寫圖片描寫敘述
這樣每次從亂序序列中取出第一個元素,從有序列中插入。直到序列總體有序為止。詳細的步驟請參見以下的算法步驟


算法步驟

  1. 默認序列中的第0個元素是有序的(由于僅僅有一個元素a[0]嘛,自然是有序的)。
  2. 從下標為1(下標從0開始)的元素開始,取當前下標i位置處的元素a[i]保存到一個暫時變量waitInsert里。
  3. 對前半部分有序序列的循環遍歷,并與waitInsert比較。直到遇到一個比waitInsert小的元素(這里默認是從小到大排序),此時的下標為j,那么如今僅僅要對a[j+1]進行賦值waitInsert就可以。
  4. 將待插入元素的下標 i 向后推移一個位置。
  5. 反復進行第2步到第4步。直到亂序序列中的元素被所有插入到有序序列中。
  6. 經過以上5個步驟之后,總體序列必定有序。排序完畢。

邏輯實現

/** 排序算法的核心模塊* * @param array*      待排序數組*/private void sortCore(int[] array) {int arraySize = array.length;for (int i = 1; i < arraySize; i++) {int j = i;int waitInsert = array[i];while(j > 0 && waitInsert < array[j - 1]) {array[j] = array[j - 1];j--;}array[j] = waitInsert;}}

復雜度分析

排序方法時間復雜度空間復雜度穩定性復雜性
平均情況最壞情況最好情況
插入排序O(n2)O(n2)O(n)O(n)穩定簡單

這里的最壞的情況和平均情況從代碼中就能夠看出來,由于有兩嵌套的for循環嘛。那么其最好的情況呢?這個就是對于一個有序的序列來說,不須要進行交換,僅僅是比較了n次,所以這里最好的時間復雜度就是O(n)。


Ref

  • 《大話數據結構》

Github源代碼下載

https://github.com/William-Hai/ArraySortAlgorithm/blob/master/src/org/algorithm/array/sort/impl/InsertSort.java

轉載于:https://www.cnblogs.com/clnchanpin/p/7141159.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/540943.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/540943.shtml
英文地址,請注明出處:http://en.pswp.cn/news/540943.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

php點擊復制按鈕到我的粘貼板,js實現點擊復制當前文本到剪貼板功能(兼容所有瀏覽器)...

最近做項目時&#xff0c;在網站框架搭建過程&#xff0c;有一個功能需要實現復制文本到剪貼板&#xff0c;相信這個功能很常用&#xff0c;但是對于不常寫JS代碼的我來說是一個比較大的挑戰&#xff0c;回想以前做過的一個站點&#xff0c;使用window.clipboardData實現復制到…

算法導論 算法_算法導論

算法導論 算法Algorithms are an integral part of the development world. Before starting coding of any software first an effective algorithm is designed to get desired outputs. In this article, we will understand what are algorithms, characteristics of algor…

[Phonegap+Sencha Touch] 移動開發77 Cordova Hot Code Push插件實現自己主動更新App的Web內容...

原文地址&#xff1a;http://blog.csdn.net/lovelyelfpop/article/details/50848524 插件地址&#xff1a;https://github.com/nordnet/cordova-hot-code-push 以下是我對GitHub項目readme的翻譯 ——————————————————————————————————————…

java 如何重寫迭代器,如何用Java按需定制自己的迭代器

編寫自己的迭代器的流程是&#xff1a;首先實現Iterable接口&#xff0c;進而實現該接口中的Iterator iterator()方法&#xff0c;該方法返回接口Iterator&#xff0c;Iterator接口中封裝了next&#xff0c;hasnext&#xff0c;remove等方法。實現了Iterable接口的類能夠通過fo…

count函數里加函數_PHP count()函數與示例

count函數里加函數PHP count()函數 (PHP count() function) "count() function" is used to get the total number of elements of an array. “ count()函數”用于獲取數組元素的總數。 Syntax: 句法&#xff1a; count(array, [count_mode])Here, 這里&#xff0…

php整合支付寶,Thinkphp5.0整合支付寶在線下單

thinkphp5.0支付寶在線支付下單整個流程&#xff0c;包括創建訂單、支付成功回調更新訂單狀態、最終跳轉到商戶訂單詳情頁查看演示下載資源&#xff1a;17次 下載資源下載積分&#xff1a;998積分支付寶在線支付控制器代碼 public function alipay() {//發起支付寶支付$order_n…

python函數示例_PHP closeir()函數與示例

python函數示例PHP Closedir()函數 (PHP closedir() function) The full form of closedir is "Close Directory", the function closedir() is used to close an opened directory. Closedir的完整格式為“ Close Directory” &#xff0c; 函數closedir()用于關閉打…

java宋江,Java編程內功-數據結構與算法「單鏈表」,

package com.structures.linkedlist;public class SingleLinkedListDemo {public static void main(String[] args) {HeroNode heroNode1 new HeroNode(1, "宋江", "及時雨");HeroNode heroNode2 new HeroNode(2, "盧俊義", "玉麒麟"…

智能家居逐漸融入AI技術 向大眾市場擴張仍需時間

雖然智能家居變得越來越普遍&#xff0c;并且大眾認知度越來越高&#xff0c;但是在這一技術變得像智能手機一樣無處不在之前&#xff0c;OEM和服務提供商仍然有很長的路要走。 在2016年11月在硅谷舉行的智能家居峰會上&#xff0c;代表們聽到了來自整個價值鏈上的聲音&#xf…

python 示例_Python使用示例設置add()方法

python 示例設置add()方法 (Set add() Method) add() method is used to add an element to the set, the method accepts an element and adds the elements to this set. add()方法用于將元素添加到集合中&#xff0c;該方法接受元素并將元素添加到該集合中。 Note: If the …

php怎么引用表單元素,表單元素:最全的各種html表單元素獲取和使用方法總結...

表單是網頁與用戶的交互工具&#xff0c;由一個元素作為容器構成&#xff0c;封裝其他任何數量的表單控件&#xff0c;還有其他任何元素里可用的標簽&#xff0c;表單能夠包含、、、、、等表單控件元素。表單元素有哪些呢&#xff1f;它包含了如下的這些元素&#xff0c;輸入文…

數據中心部署氣流遏制系統需要考慮的十大要素

數據中心氣流遏制策略能夠大幅提高傳統數據中心制冷系統的可預測性和效率。事實上&#xff0c;綠色網格組織&#xff08;The Green Grid&#xff09;將氣流管理策略稱作“實施數據中心節能計劃的起點”。但是&#xff0c;大多數已有數據中心由于受各種條件的制約&#xff0c;只…

JAVA語言異常,Java語言中的異常

1、異常分類從產生源頭來看&#xff0c;Java語言中的異常可以分為兩類&#xff1a;JVM拋出的異常。比如&#xff1a;訪問null引用會引發NullPointerException&#xff1b;0作為除數&#xff0c;如9/0&#xff0c;JVM會拋出ArithmeticException&#xff1b;內存消耗完&#xff0…

使用Mybatis Generator結合Ant腳本快速自動生成Model、Mapper等文件的方法

新建generatorConfig.xml和build_mybatis.xml&#xff1a; jar下載 <dependency><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-core</artifactId><version>1.3.2</version></dependency> <depe…

java bitset_Java BitSet or()方法與示例

java bitsetBitSet類或()方法 (BitSet Class or() method) or() method is available in java.util package. or()方法在java.util包中可用。 or() method is used to perform logical OR between this BitSet and the given BitSet(bs). This BitSet is updated when either t…

matlab 細化函數,MATLAB圖像處理工具箱函數(細化篇).doc

MATLAB圖像處理工具箱函數(細化篇)第3章 MATLAB數字圖像處理工具箱3.1 MATLAB圖像預處理3.1.1 圖像處理的基本操作1. 讀入并顯示一幅圖像clear %清除所有的工作平臺變量close all %關閉已打開的圖形窗口Iimread (pout.tif); %讀取圖像pout.tif(該圖像是圖像處理工具箱自帶的圖像…

STM32啟動解析

啟動方式對的不同下載模式 STM32可以通過BOOT引腳的配置&#xff0c;來選擇不同的啟動模式------對應不同的下載方式。 仿真器下載—— 內部FLASH的啟動方式 串口下載 —— 系統存儲器的啟動方式 內部SRAM一般不用&#xff0c;不講 啟動過程 以內部FLASH的啟動方式為例&am…

OpenBSD基金會收到錘子科技約140萬捐贈款

11月26日消息&#xff0c;給開源項目捐款一向是錘子科技發布會的傳統&#xff0c;去年發布會的門票收入捐給了國人章亦春主導的開源項目OpenResty。今年&#xff0c;錘子科技選擇將收益捐贈給OpenBSD基金會。OpenBSD基金會收到錘子科技約140萬捐贈款 OpenBSD基金會11月23日發布…

自動化部署kvm虛擬機_自動化虛擬助手

自動化部署kvm虛擬機The automated virtual assistant or commonly called personal assistants, are developed to serve its users by performing some tasks, setting reminders and much more based on the input is given and local awareness. It is integrated with a l…

php 數據庫編碼,php怎么設置數據庫編碼方式

在php中&#xff0c;可以使用mysql_query()函數來設置mysql數據庫的編碼方式&#xff1b;具體方法&#xff1a;在mysql_connect()語句之后添加“mysql_query("set names 編碼方式");”代碼即可。本教程操作環境&#xff1a;windows7系統、PHP7.1版&#xff0c;DELL G…