国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【數(shù)據(jù)結(jié)構(gòu)與算法】十大經(jīng)典排序算法-插入排序

這篇具有很好參考價值的文章主要介紹了【數(shù)據(jù)結(jié)構(gòu)與算法】十大經(jīng)典排序算法-插入排序。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

??個人博客:www.hellocode.top
??Java知識導(dǎo)航:Java-Navigate
??CSDN:HelloCode.
??知乎:HelloCode
??掘金:HelloCode
?如有問題,歡迎指正,一起學(xué)習(xí)~~


插入排序(Insertion Sort)是一種簡單直觀的排序算法,其基本思想是將一個記錄插入到已排好序的有序序列中,直到所有記錄插入完成為止。

基本思想

【數(shù)據(jù)結(jié)構(gòu)與算法】十大經(jīng)典排序算法-插入排序,數(shù)據(jù)結(jié)構(gòu)與算法,排序算法,算法,java

如上圖所示,插入排序的基本思想就是將一個數(shù)組劃分為兩部分:有序部分和無序部分。通過將無序部分的元素依次插入有序部分(需要找到對應(yīng)的正確位置),讓每次插入的每個元素都能在正確的位置,保證有序部分始終有序,在將無序部分的元素全部插入到有序部分后,整個集合也就為有序的了。

  1. 從第二個元素開始,依次將當(dāng)前元素插入到已排好序的有序序列中,直到最后一個元素。
  2. 插入當(dāng)前元素時,從后往前遍歷已排好序的有序序列,找到當(dāng)前元素在有序序列中的位置,并將其插入到該位置。
  3. 重復(fù)執(zhí)行步驟2,直到所有元素都插入完畢。

舉個例子,比如我們有一組數(shù)字 [5, 3, 8, 4, 2],我們可以首先把第一個數(shù)字5視為已排序序列,然后從第二個數(shù)字3開始,與已排序序列中的元素逐一比較,找到合適的位置插入。然后針對第三個數(shù)字8,我們再重復(fù)這個過程,直至所有的數(shù)字都插入到已排序序列中。

代碼實現(xiàn)

具體的代碼就是兩層for循環(huán),外層控制未排序部分的指針,內(nèi)層不斷循環(huán)尋找新插入元素的正確位置,代碼如下:

/**
 * @author HelloCode
 * @blog https://www.hellocode.top
 * @date 2023年08月09日 21:45
 */
public class InsertSort {

    public static void main(String[] args) {
        int[] arr = {21, 64, 32, 11, 9, 5, 3, 41, 75, 32, 12, 98, 66};
        System.out.println("排序前:" + Arrays.toString(arr));
        insertSort(arr);
        System.out.println("排序后:" + Arrays.toString(arr));
    }

    public static void insertSort(int[] arr) {
        // 外層循環(huán),i指向數(shù)組中未排序的元素,也可以表示已經(jīng)有序元素的個數(shù)
        for (int i = 1; i < arr.length; i++) {
            // 內(nèi)層for指向已經(jīng)排好序的最后一個元素
            for (int j = i - 1; j >= 0; j--) {
                // 開始排序,尋找新加入的元素的正確位置,(j + 1)代表新加入的元素
                if (arr[j + 1] >= arr[j]) {
                    // 代表不用交換,加入即有序,直接跳出循環(huán)
                    break;
                }
                // 否則需要進(jìn)行交換,直到找到合適位置
                int temp = arr[j + 1];
                arr[j + 1] = arr[j];
                arr[j] = temp;
            }
        }
    }
}

測試:

【數(shù)據(jù)結(jié)構(gòu)與算法】十大經(jīng)典排序算法-插入排序,數(shù)據(jù)結(jié)構(gòu)與算法,排序算法,算法,java

優(yōu)化

對于插入排序,能夠優(yōu)化的點我認(rèn)為是在為新插入元素尋找正確位置的時候,上面的代碼采用的是依次比較,類似于冒泡排序的思想。如果數(shù)據(jù)量大且情況最差的時候,效率就有些不理想了,因此可以用其他方法在此處進(jìn)行優(yōu)化,提升插入排序的性能

二分查找:在每次需要插入元素時,使用二分查找來找到插入的位置,而不是從頭到尾掃描已排序序列。這樣可以將比較次數(shù)降低為O(log n)。

具體代碼這里就不列了,后面可能會有專門的二分查找文章。文章來源地址http://www.zghlxwxcb.cn/news/detail-636391.html

總結(jié)

優(yōu)點

  1. 實現(xiàn)簡單,對于部分有序的數(shù)組效率高。
  2. 對于小規(guī)模數(shù)據(jù)或者部分有序的數(shù)據(jù),插入排序的運行時間相對較短。

缺點

  1. 對于大規(guī)模數(shù)據(jù)或者隨機數(shù)據(jù),插入排序的時間復(fù)雜度較高,為O(n^2)。
  2. 是非穩(wěn)定的排序算法,即相等的元素可能會因為排序而變得順序顛倒。

復(fù)雜度

  • 時間復(fù)雜度:O(n^2)
  • 空間復(fù)雜度:O(1)

使用場景

  1. 小型數(shù)據(jù)集:對于小型的數(shù)據(jù)集,插入排序是一種高效且簡單的排序算法
  2. 部分排序的數(shù)據(jù)集:如果一個數(shù)據(jù)集大部分是排序的,那么插入排序?qū)⑹且粋€很好的選擇。例如,考慮一個場景,一個團(tuán)隊在一場比賽中獲得了一組分?jǐn)?shù),這些分?jǐn)?shù)按照高低已經(jīng)被排序,但是有一個新的分?jǐn)?shù)需要插入到合適的位置。在這種情況下,插入排序可以快速找到新分?jǐn)?shù)的位置并把它插入到正確的位置。
  3. 外部排序:當(dāng)處理非常大的數(shù)據(jù)集時,可能需要使用外部排序。外部排序是指那些不能一次性加載到內(nèi)存中的數(shù)據(jù)的排序。在這種情況下,可以使用插入排序作為子程序,從外部存儲器中讀取元素并將它們插入到已經(jīng)排序的部分中。
  4. 與其他算法結(jié)合:插入排序也可以與其他算法結(jié)合使用。例如,當(dāng)需要先對數(shù)據(jù)進(jìn)行排序,然后再進(jìn)行一些復(fù)雜的操作時,可以使用插入排序作為預(yù)處理步驟。

到了這里,關(guān)于【數(shù)據(jù)結(jié)構(gòu)與算法】十大經(jīng)典排序算法-插入排序的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 《數(shù)據(jù)結(jié)構(gòu)與算法》之十大基礎(chǔ)排序算法

    《數(shù)據(jù)結(jié)構(gòu)與算法》之十大基礎(chǔ)排序算法

    冒泡排序是一種交換排序,它的思路就是在待排序的數(shù)據(jù)中,兩兩比較相鄰元素的大小,看是否滿足大小順序的要求,如果滿足則不動,如果不滿足則讓它們互換。 然后繼續(xù)與下一個相鄰元素的比較,一直到一次遍歷完成。一次遍歷的過程就被成為一次冒泡,一次冒泡的結(jié)束

    2024年02月05日
    瀏覽(24)
  • 算法 數(shù)據(jù)結(jié)構(gòu) 遞歸插入排序 java插入排序 遞歸求解插入排序算法 如何用遞歸寫插入排序 插入排序動圖 插入排序優(yōu)化 數(shù)據(jù)結(jié)構(gòu)(十)

    算法 數(shù)據(jù)結(jié)構(gòu) 遞歸插入排序 java插入排序 遞歸求解插入排序算法 如何用遞歸寫插入排序 插入排序動圖 插入排序優(yōu)化 數(shù)據(jù)結(jié)構(gòu)(十)

    1. 插入排序(insertion-sort): ????????????????????????????????????????? 是一種簡單直觀的排序算法。它的工作原理是通過構(gòu)建有序序列,對于未排序數(shù)據(jù),在已排序序列中從后向前掃描,找到相應(yīng)位置并插入 ??? 算法穩(wěn)定性: ?????????????????

    2024年02月09日
    瀏覽(23)
  • 數(shù)據(jù)結(jié)構(gòu)算法-插入排序

    數(shù)據(jù)結(jié)構(gòu)算法-插入排序

    一、概念及其介紹 插入排序(InsertionSort),一般也被稱為直接插入排序。 對于少量元素的排序,它是一個有效的算法。插入排序是一種最簡單的排序方法,它的基本思想是將一個記錄插入到已經(jīng)排好序的有序表中,從而一個新的、記錄數(shù)增 1 的有序表 。在其實現(xiàn)過程使用雙層

    2024年02月21日
    瀏覽(22)
  • 數(shù)據(jù)結(jié)構(gòu)與算法—插入排序&選擇排序

    數(shù)據(jù)結(jié)構(gòu)與算法—插入排序&選擇排序

    目錄 一、排序的概念 二、插入排序?? 1、直接插入排序? 特性總結(jié): 2、希爾排序 特性總結(jié): ?三、選擇排序 1、直接選擇排序? 特性總結(jié): 2、堆排序—排升序(建大堆) 向下調(diào)整函數(shù) 堆排序函數(shù) 特性總結(jié): 代碼完整版:? ?頭文件 ?函數(shù)文件 ?測試文件 排序 :所謂排序,

    2024年01月20日
    瀏覽(21)
  • 數(shù)據(jù)結(jié)構(gòu)算法練習(xí) 插入排序 冒泡排序

    插入排序 代碼如下? package main import \\\"fmt\\\" func main() { ? ? a := []int{4, 5, 6, 1, 3, 2}? ?? ? ? b := insert(a) ? ? for i := 0; i len(b); i++ { ? ? ? ? fmt.Println(b[i]) ? ? } } func insert(a []int) []int { ? ? if len(a) = 1 {? ? ? ? ? ? ? ? ? ?如果數(shù)組長度小于等于1 不用排序直接返回? ? ? ? ? retur

    2024年02月08日
    瀏覽(29)
  • 數(shù)據(jù)結(jié)構(gòu)與算法:插入排序&希爾排序

    數(shù)據(jù)結(jié)構(gòu)與算法:插入排序&希爾排序

    假設(shè)現(xiàn)在你有一個有序的數(shù)組,你要把一個數(shù)據(jù)插入到數(shù)組中,保證插入后依然有序,要怎么做? 對于人來說,這個問題就像是在整理撲克牌,瞄一眼就知道應(yīng)該插入什么位置。但是對于程序來說,就需要一一對比,直到找到一個位置 左邊比它大,右邊比它小 ,就算找到了

    2024年01月17日
    瀏覽(38)
  • 【數(shù)據(jù)結(jié)構(gòu)】常見排序算法——常見排序介紹、插入排序、直接插入排序、希爾排序

    【數(shù)據(jù)結(jié)構(gòu)】常見排序算法——常見排序介紹、插入排序、直接插入排序、希爾排序

    ??在計算機科學(xué)中,排序是將一組數(shù)據(jù)按照指定的順序排列的過程。排序算法由于執(zhí)行效率的不同可以分為多種不同的算法。 ??通常情況下,排序算法可以分為兩類,即 內(nèi)部排序和外部排序 。內(nèi)部排序是指數(shù)據(jù)全部加載到內(nèi)存中進(jìn)行排序,適用于數(shù)據(jù)量較小的情況,而

    2024年02月08日
    瀏覽(34)
  • 數(shù)據(jù)結(jié)構(gòu)算法--2 冒泡排序,選擇排序,插入排序

    數(shù)據(jù)結(jié)構(gòu)算法--2 冒泡排序,選擇排序,插入排序

    思想就是將相鄰元素兩兩比較,當(dāng)一個元素大于右側(cè)相鄰元素時,交換他們的位置,小于右側(cè)元素時,位置不變,最終序列中的最大元素,像氣泡一樣,到了最右側(cè)。 這時冒泡排序第一輪結(jié)束,數(shù)列最右側(cè)元素9的位置可認(rèn)為是一個有序區(qū),有序區(qū)目前有一個元素. 第二輪排序

    2024年02月13日
    瀏覽(91)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】排序算法(選擇排序,冒泡排序,插入排序,希爾排序)

    基本概念這了就不浪費時間解釋了,這四種都是很簡單的排序方式,本專欄后續(xù)文章會出歸并排序,計數(shù)排序,快速排序,堆排序,桶排序等排序算法,今天這篇文章中給出選擇排序,冒泡排序,插入排序和希爾排序的實現(xiàn); 如果發(fā)現(xiàn)文章中有錯誤,還請大家指出來,我會非

    2024年02月15日
    瀏覽(96)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】:插入排序與希爾排序

    【數(shù)據(jù)結(jié)構(gòu)與算法】:插入排序與希爾排序

    ?? 個人主頁 : Quitecoder ?? 專欄 : 數(shù)據(jù)結(jié)構(gòu)與算法 歡迎大家來到初階數(shù)據(jù)結(jié)構(gòu)的最后一小節(jié):排序 排序是一種將一組對象按照某種特定順序重新排列的過程。在計算機科學(xué)中,排序是數(shù)據(jù)處理中非?;厩抑匾牟僮鳎梢詭椭藗兏行У乩斫夂头治鰯?shù)據(jù)。排序的順序

    2024年03月18日
    瀏覽(29)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包