摘要:一前言直接插入排序序是一種最簡單的插入排序。所以,數據越接近正序,直接插入排序的算法性能越好。算法穩定性直接插入排序的過程中,不需要改變相等數值元素的位置,所以它是穩定的算法。
一、前言
直接插入排序(Insertion Sort)序是一種最簡單的插入排序。為簡化問題,我們下面只討論升序排序。
二、算法思想
插入排序:每一趟將一個待排序的記錄,按照其關鍵字的大小插入到有序隊列的合適位置里,直到全部插入完成。
假設有一組無序序列 R0, R1, ... , RN-1。
(1) 我們先將這個序列中下標為 0 的元素視為元素個數為 1 的有序序列。
(2) 然后,我們要依次把 R1, R2, ... , RN-1 插入到這個有序序列中。所以,我們需要一個外部循環,從下標 1 掃描到 N-1 。
(3) 接下來描述插入過程。假設這是要將 Ri 插入到前面有序的序列中。由前面所述,我們可知,插入Ri時,前 i-1 個數肯定已經是有序了。
所以我們需要將Ri 和R0 ~ Ri-1 進行比較,確定要插入的合適位置。這就需要一個內部循環,我們一般是從后往前比較,即從下標 i-1 開始向 0 進行掃描。
代碼
# -*- coding:utf-8 -*- def insertSort(input_list): if len(input_list) == 0: return [] sorted_list = input_list for i in range(1, len(sorted_list)): temp = sorted_list[i] j = i - 1 while j >=0 and temp < sorted_list[j]: sorted_list[j + 1] = sorted_list[j] j -= 1 sorted_list[j + 1] = temp return sorted_list if __name__ == "__main__": input_list = [6, 4, 8, 9, 2, 3, 1] print("排序前:", input_list) sorted_list = insertSort(input_list) print("排序后:", sorted_list)
三、算法分析
1、直接插入排序的算法性能
2、時間復雜度
當數據正序時,執行效率最好,每次插入都不用移動前面的元素,時間復雜度為O(N)。
當數據反序時,執行效率最差,每次插入都要前面的元素后移,時間復雜度為O(N^2)。
所以,數據越接近正序,直接插入排序的算法性能越好。
3、空間復雜度
由直接插入排序算法可知,我們在排序過程中,需要一個臨時變量存儲要插入的值,所以空間復雜度為 1 。
4、算法穩定性
直接插入排序的過程中,不需要改變相等數值元素的位置,所以它是穩定的算法。
四、優化
因為在一個有序序列中查找一個插入位置,以保證有序序列的序列不變,所以可以使用二分查找,減少元素比較次數提高效率。
二分查找是對于有序數組而言的,假設如果數組是升序排序的。那么,二分查找算法就是不斷對數組進行對半分割,每次拿中間元素和目標數字進行比較,如果中間元素小于目標數字,則說明目標數字應該在右側被分割的數組中,如果中間元素大于目標數字,則說明目標數字應該在左側被分割的數組中。
代碼
# -*- coding:utf-8 -*- def BinarySearch(input_list, end, value): left = 0 right = end - 1 while left <= right: middle = left + (right - left) // 2 if input_list[middle] >= value: right = middle - 1 else: left = middle + 1 return left if left < end else -1 def BinaryInsertSort(input_list): if len(input_list) == 0: return [] result = input_list for i in range(1, len(input_list)): j = i - 1 temp = result[i] insert_index = BinarySearch(result, i, result[i]) if insert_index != -1: while j >= insert_index: result[j + 1] = result[j] j -= 1 result[j + 1] = temp return result if __name__ == "__main__": input_list = [6, 4, 8, 9, 2, 3, 1] print("排序前:", input_list) sorted_list = insertSort(input_list) print("排序后:", sorted_list)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/43314.html
本篇有7k+字, 系統梳理了js中常見的12種排序算法。除了基本排序算法,文章還包含了希爾排序、堆排序、桶排序等較為復雜的排序實現,如果喜歡請點贊支持~謝謝. 原文: http://louiszhai.github.io/20... 導讀 排序算法可以稱得上是我的盲點, 曾幾何時當我知道Chrome的Array.prototype.sort使用了快速排序時, 我的內心是奔潰的(啥是快排, 我只知道...
希爾排序 在介紹希爾排序之前,先了解一下直接插入排序 文章目錄 希爾排序一、直接插入排序1. 單趟排序2. 直接插入排序 二、希爾排序三、測試希爾排序和直接插入排序性能 一、直接插入排序 1. 單趟排序 x插入一個有序區間 這里end是指向數組最后一個元素 2. 直接插入排序 根據上面的單趟排序啟發 end是數組的最后一個元素,end之后的元素都是待排序 一個關鍵的判斷點,end和...
摘要:之所以把冒泡排序選擇排序插入排序放在一起比較,是因為它們的平均時間復雜度都為。其中,冒泡排序就是原地排序算法。所以冒泡排序是穩定的排序算法。選擇排序思路選擇排序算法的實現思路有點類似插入排序,也分已排序區間和未排序區間。 showImg(https://segmentfault.com/img/bVbuvnj?w=900&h=250); 1. 前言 算法為王。 想學好前端,先練好內功,...
摘要:本篇博客我要來和大家一起聊一聊數據結構初階中的最后一篇博客八大經典排序算法的總結,其中會介紹他們的原來,還有復雜度的分析以及各種優化。快速排序遞歸版本快速排序是于年提出的一種二叉樹結構的交換排序方法。 ...
閱讀 4838·2021-10-13 09:39
閱讀 1962·2019-08-29 11:12
閱讀 1154·2019-08-28 18:16
閱讀 1867·2019-08-26 12:16
閱讀 1254·2019-08-26 12:13
閱讀 3001·2019-08-26 10:59
閱讀 2308·2019-08-23 18:27
閱讀 2998·2019-08-23 18:02