排序系列【比較排序系列之】直接插入排序

最近在和小伙伴們一起研究排序,排序分好多總,后期會做整體總結,本篇則主要對插入排序進行一個整理。
插入排序(insert sorting)的算法思想十分簡單,就是對待排序的記錄逐個進行處理,每個新紀錄與同組那些已排好序的記錄進行比較,然后插入到適當的位置。用三個字總結就是—-“多對一”的關系。
插入排序分好幾種,比如二分插入排序,交換插入排序,直接插入排序,本篇我們重點總結最熟悉的“直接插入排序”。
比如有一個數組【45 34 78 12 34’ 32 29 64】,我們針對此進行一下講解。

排序過程 數組{45 34 78 12 34’ 32 29 64}
第一遍 45和34比較,34<45,所以排序完成為34 45 78 12 34’ 32 29 64
第二遍 78和34 45比較 78>45 78>34,所以位置不變,排序完為 34 45 78 12 34’ 32 29 64
第三遍 12和34 45 78比較 12<78 左移+1,12<45 左移+2,12<34 左移+3,排序完為 12 34 45 78 34’ 32 29 64
第四遍 34’ 左移+2 排序完 12 34 34’ 45 78 32 29 64
第五遍 32 左移+4 排序完 12 32 34 34’ 45 78 29 64
第六遍 29 左移+6 排序完 12 29 32 34 34’ 45 78 64
第七遍 64 左移+1 排序完 12 29 32 34 34’ 45 64 78

用代碼實現的話其實更簡單,引入一個臨時變量,具體看代碼:

 public static void main(String[] args) {Test2 test2 = new Test2();//定義一個數組int[] array = {45, 34, 78, 12, 34, 32 ,29 ,64};test2.insertSort(array);System.out.println(Arrays.toString(array));}void insertSort(int[] array) {//定義的臨時變量int tempRecord;//i從1開始的原因是j=j-1for (int i = 1; i < array.length; i++) {tempRecord = array[i];int j = i - 1;//j不能為負數,根據索引判定值大小,通過臨時變量進行交換while (j >= 0 && tempRecord < array[j]) {array[j + 1] = array[j];j = j - 1;}array[j + 1] = tempRecord;}}
2018073014:30:55補充:
array[j + 1] = tempRecord,應該放入while循環內,因為若tempRecore不小于array[j],則此次i循環則直接結束。

通過代碼我們來看一下時間復雜度和空間復雜度。
因為我們只引入了一個輔助存放插入記錄的臨時變量,因此空間代價為一個記錄大小 及O(1);

當數據正序時,如上我們口述的排序比較過程,執行效率最好,每次插入都不用移動前面的元素,有N個元素參與比較,時間復雜度為O(N)。

當數據反序時,則執行效率最差,每次插入都要前面的元素后移,
i=1時,移動2-1;
i=2時,移動3-1;
當i=n時,移動n-1;
求和公式:n(n-1)/2=O(n2)
所以最壞的時間復雜度為O(N2)

轉載于:https://www.cnblogs.com/huohuoL/p/10545426.html

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

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

相關文章

Mysql 無法插入中文,中文亂碼解決

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 在計算機中搜索 my.ini文件 找到后打開 &#xff0c;并找到這2行作 如下設置 &#xff1a; default-character-setutf8character-se…

gcc g++安裝

2019獨角獸企業重金招聘Python工程師標準>>> 安裝之前要卸載掉老版本的gcc、g sudo apt-get remove gccgcc-xx #可能有多個版本&#xff0c;都要刪掉 sudo apt-get remove g sudo apt-get install gcc 安裝g編譯器&#xff0c;可以通過命令 sudo apt-get installb…

網絡爬蟲--24.【selenium實戰】實現拉勾網爬蟲之--分析接口獲取數據

文章目錄一. 思路概述二. 分析數據接口三. 詳細代碼一. 思路概述 1.拉勾網采用Ajax技術&#xff0c;加載網頁時會向后端發送Ajax異步請求&#xff0c;因此首先找到數據接口&#xff1b; 2.后端會返回json的數據&#xff0c;分析數據&#xff0c;找到單個招聘對應的positionId…

18條工作感想:不要不情愿地工作

18條工作感想&#xff1a;不要不情愿地工作。人生有兩個基點支撐&#xff1a;家庭與工作。對工作不滿意&#xff0c;就是毀掉一半的人生。 001 不要不情愿地工作。不情愿&#xff0c;就一定沒熱情&#xff0c;沒激情&#xff0c;沒動力&#xff0c;就不會用心……那么&#xf…

bzoj 1999: [Noip2007]Core樹網的核【樹的直徑+單調隊列】

我要懶死了&#xff0c;所以依然是lyd的課件截圖 注意是min{max(max(d[uk]),dis(u1,ui),dis(uj,un))}&#xff0c;每次都從這三個的max里取min #include<iostream> #include<cstdio> using namespace std; const int N500005; int n,m,h[N],cnt,d[N],s,t,mx,f[N],a…

01-匯編初學

0、前言 對于一個iOS App來說&#xff0c;它其實就是一個安裝在手機中的可執行文件&#xff0c;這個可執行文件本質上是二進制文件&#xff0c;它由iPhone手機上的CPU執行。如果我們需要對操作系統、App進行深入了解&#xff0c;以及App的逆向都需要我們熟悉匯編語言 1、匯編語…

jquery.dataTables.min.js:62 Uncaught TypeError: Cannot read property ‘style‘ of undefined原因

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 報錯&#xff1a; jquery.dataTables.min.js:62 Uncaught TypeError: Cannot read property style of undefined 原因&#xff1a;data…

ASCII Unicode GBK UTF的聯系

快下班時&#xff0c;愛問問題的小朋友Nico又問了一個問題&#xff1a; "sqlserver里面有char和nchar&#xff0c;那個n據說是指unicode的數據&#xff0c;這個是什么意思。" 并不是所有簡單的問題都很容易回答&#xff0c;就像這個問題一樣。于是我答應專門寫一篇BL…

網絡爬蟲--25.【selenium實戰】實現拉勾網爬蟲之--selenium獲取數據

代碼實現 #encoding: utf-8from selenium import webdriver from lxml import etree import re import time from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by…

Java 設計模式-【單例模式】

單例解決了什么問題&#xff1a;為了節約系統資源&#xff0c;有時需要確保系統中某個類只有唯一一個實例&#xff0c;當這個唯一實例創建成功之后&#xff0c;我們無法再創建一個同類型的其他對象&#xff0c;所有的操作都只能基于這個唯一實例。為了確保對象的唯一性&#xf…

Lua游戲開發----模塊

1&#xff1a;游戲目錄結構對模塊的理解&#xff1a; Base&#xff0c;Common&#xff0c;Game這三個文件夾下都有自己的moduleConfig文件。 base文件夾下的moduleConfig.lua文件是存放游戲基礎的模塊&#xff08;例如&#xff1a;游戲視圖準備&#xff0c;發牌&#xff0c;托管…

css 引用 方法

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 CSS 樣式一共 3 中使用方法 ——內聯式樣式表行樣式<div style"color:#000;"></div>只能操作1個標簽&#xff0…

java構造方法

構造方法是一種特殊的方法&#xff0c;它是一個與類同名且沒有返回值類型的方法。對象的創建就是通過構造方法來完成&#xff0c;其功能主要是完成對象的初始化。當類實例化一個對象時會自動調用構造方法。構造方法和其他方法一樣也可以重載。 構造方法就是與類同名的那個方法…

轉 單實例的寫法

目錄 餓漢法單線程寫法考慮線程安全的寫法兼顧線程安全和效率的寫法坑靜態內部類法枚舉寫法總結參考資料轉載: 你真的會寫單例模式嗎——Java實現 單例模式可能是代碼最少的模式了&#xff0c;但是少不一定意味著簡單&#xff0c;想要用好、用對單例模式&#xff0c;還真得費一…

網絡爬蟲--26.Scrapy中下載器中間件Downloader Middlewares的使用

文章目錄一. Downloader Middlewares二. 設置隨機請求頭三. ip代理池中間件一. Downloader Middlewares 二. 設置隨機請求頭 三. ip代理池中間件

變量名和方法名

變量名&#xff1a;第一個單詞的首字母小寫&#xff0c;后面每一個單詞的首字母大寫。如userName; 方法名&#xff1a;第一個單詞的首字母小寫&#xff0c;后面每一個單詞的首字母大寫。如setName&#xff08;&#xff09;; 寫出讓人一眼看懂的變量名和方法名&#xff0c;命名應…

openfire服務器

openfire(原名Wildfire或者JiveMessenger)是由Java語言編寫的、基于XMPP協議的服務器&#xff0c;具有跨平臺能力&#xff0c;獲得了Apache2.0許可證。 openfire是基于XMPP協議的IM的服務器端的一個實現&#xff0c;兩個用戶想要進行通訊&#xff0c;首先要連接到Openfire。服…

解決eclipse配置Tomcat時找不到server選項(Mars.2也可用)

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 集成Eclipse和Tomcat時找不到server選項&#xff1a; 按照網上的步驟如下&#xff1a; 在Eclipse中&#xff0c;窗口(window)——首選項…

網絡爬蟲--27.csv文件的讀取和寫入

文章目錄一. csv文件二. 讀取csv文件的兩種方式三. 寫入csv文件的兩種方式一. csv文件 二. 讀取csv文件的兩種方式 import csvdef read_csv_demo1():with open(classroom1.csv,r,encodingutf-8,newline) as fp:# reader是一個迭代器reader csv.reader(fp)next(reader)for x i…

Quiver快速入門

Quiver快速入門 裝載自&#xff1a;https://github.com/HappenApps/Quiver/wiki/Quiver%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8Quiver 是一個程序員專用的記事本應用&#xff0c;可輕松混合文本、代碼、Markdown、LaTeX 到一個記事本中。提供強大的代碼編輯功能&#xff0c;以及…