C語言插入排序算法及代碼

2020-12-13 百度經驗

插入排序是排序算法的一種,它不改變原有的序列(數組),而是創建一個新的序列,在新序列上進行操作。這裡以從小到大排序為例進行講解。

基本思想及舉例說明插入排序的基本思想是,將元素逐個添加到已經排序好的數組中去,同時要求,插入的元素必須在正確的位置,這樣原來排序好的數組是仍然有序的。

在實際使用中,通常是排序整個無序數組,所以把這個無序數組分為兩部分排序好的子數組和待插入的元素。第一輪時,將第一個元素作為排序好的子數組,插入第 二個元素;第二輪,將前兩個元素作為排序好的數組,插入第三個元素。以此類推,第i輪排序時,在前i個元素的子數組中插入第i+1個元素。直到所有元素都 加入排序好數組。

下面,以對 3  2  4  1 進行選擇排序說明插入過程,使用j記錄元素需要插入的位置。排序目標是使數組從小到大排列。第1輪[ 3 ]  [ 2  4  1 ]  (最初狀態,將第1個元素分為排序好的子數組,其餘為待插入元素)[ 3 ]  [ 2  4  1 ]  (由於3>2,所以待插入位置j=1)[ 2  3 ]  [ 4  1 ]  (將2插入到位置j)第2輪[ 2  3 ]  [ 4  1 ] (第1輪排序結果)[ 2  3 ]  [ 4  1 ] (由於2<4,所以先假定j=2)[ 2  3 ]  [ 4  1 ] (由於3<4,所以j=3)[ 2  3  4 ]  [ 1 ] (由於4剛好在位置3,無需插入)第3輪[ 2  3  4 ]  [ 1 ] (第2輪排序結果)[ 2  3  4 ]  [ 1 ] (由於1<2,所以j=1)[1  2  3  4 ]    (將1插入位置j,待排序元素為空,排序結束)

算法總結及實現選擇排序對大小為N的無序數組R[N]進行排序,進行N-1輪選擇過程。首先將第1個元素作為已經排序好的子數組,然後將剩餘的N-1個元素,逐個插入到已經排序好子數組;。因此,在第 i輪排序時,前i個元素總是有序的,將第i+1個元素插入到正確的位置。

#include<stdio.h>#include<stdlib.h>#define N 8void insert_sort(int a[],int n);//插入排序實現,這裡按從小到大排序void insert_sort(int a[],int n)//n為數組a的元素個數{//進行N-1輪插入過程for(int i=1; i<n; i++){//首先找到元素a[i]需要插入的位置int j=0;while( (a[j]<a[i]) && (j<i)){j++;}//將元素插入到正確的位置if(i != j)  //如果i==j,說明a[i]剛好在正確的位置{int temp = a[i];for(int k = i; k > j; k--){a[k] = a[k-1];}a[j] = temp;}}}int  main(){int num[N] = {89, 38, 11, 78, 96, 44, 19, 25};insert_sort(num, N);for(int i=0; i<N; i++)printf("%d  ", num[i]);printf("\n");system("pause");return 0;}

注意:插入排序是一種穩定的排序算法,不會改變原有序列中相同數字的順序。

插入排序是在一個已經有序的小序列的基礎上,一次插入一個元素。當然,剛開始這個有序的小序列只有1個元素,就是 第一個元素。比較是從有序序列的末尾開始,也就是想要插入的元素和已經有序的最大者開始比起,如果比它大則直接插入在其後面,否則一直往前找直到找到它該 插入的位置。如果碰見一個和插入元素相等的,那麼插入元素把想插入的元素放在相等元素的後面。所以,相等元素的前後順序沒有改變,從原無序序列出去的順序 就是排好序後的順序,所以插入排序是穩定的。

相關焦點

  • C語言八大排序算法,附動圖和詳細代碼解釋!
    如下圖所示:3、算法分析1.插入排序  *直接插入排序  *希爾排序2.選擇排序  *簡單選擇排序  *堆排序3.交換排序  *冒泡排序  *快速排序4.歸併排序5.基數排序不穩定排序:簡單選擇排序,快速排序,希爾排序,堆排序穩定排序:冒泡排序,直接插入排序,歸併排序
  • 圖解,C語言數據結構,插入排序
    C語言,誰都能看得懂的歸併排序高中新生開學,需要進行軍訓,軍訓的時候,教官需要大家把按高到低排隊排好。先隨機找到一個比較帥的男生做排頭。然後第二個人過來跟這個男生比身高,如果比第一個高,就排到左邊,要不就排到右邊。然後第三個人過來了,他需要在原來的兩個人中找到自己的位置。
  • 筆試題:編寫插入排序代碼,比冒泡排序還簡單(附代碼)
    最近有同事跳槽某大企業(「**在手,說走就走」),竟然被問到簡單的排序算法,不過不是大家耳熟能詳的冒泡排序,而是插入排序。本文將詳細說明插入排序算法的原理與具體實現代碼,以供大家參考、學習。插入排序插入排序的原理這裡就不用文字來描述原理了,直接以圖例為大家解釋:簡單的說就是把下一位數和前面的N-1個數逐一比較,如果比前面的小,就互換位置,然後再把N-1位和其前面的N-2個數逐一比較
  • 算法系列: 10大常見排序算法(3)插入排序
    本課程是從少年編程網轉載的課程,目標是向中學生詳細介紹計算機比賽涉及的程式語言,數據結構和算法。
  • 排序算法之插入排序
    排序算法在編程領域中起著舉足輕重的作用,在目標檢索、機器學習、數值計算、圖像處理等領域有著廣泛地應用。為了追本溯源,公眾號特推出常用經典排序算法系列推文,讓小夥伴們深入了解排序算法的實現原理,同時也提升matlab編程能力。
  • 插入排序算法,就這麼簡單
    確定該算法重要的指標:第一是否能解決問題;第二算法運行時間,即解決問題出結果需要多少時間;還有所需的空間資源,比如內存等。很多時候,寫一個工作程序並不夠。因為遇到大數據下,運行時間就是一個重要的問題。算法性能用大 O 標記法表示。大 O 標記法是標記相對增長率,精度是粗糙的。比如 2N 和 3N + 2 ,都是 O(N)。
  • C語言實現八大排序算法(一)
    本文主要介紹數據結構中常見的八大排序算法,冒泡排序、快速排序、直接插入排序、希爾排序、簡單選擇排序、堆排序、歸併排序和基數排序。
  • Go語言實現常用排序算法
    我們把冒泡排序,直接選擇排序,直接插入排序認為是初級的排序算法,其中直接插入排序的性能是綜合最好的,一般來說,當排序數組規模 n 較小時,直接插入排序可能比任何排序算法都要快,建議只在小規模排序中使用。
  • 寫出高效優美的單片機C語言代碼
    程序能跑起來並不見得你的代碼就是很好的c代碼了,衡量代碼的好壞應該從以下幾個方面來看1,代碼穩定,沒有隱患。下面發一些我在網上看到的技巧和自己的一些經驗來和大家分享;1、如果可以的話少用庫函數,便於不同的mcu和編譯器間的移植2、選擇合適的算法和數據結構應該熟悉算法語言,知道各種算法的優缺點,具體資料請參見相應的參考資料,有很多計算機書籍上都有介紹。
  • Python中的插入排序算法,插入排序的優缺點,中級python技術點
    像冒泡排序一樣,插入排序算法也易於實現和理解。但是與冒泡排序不同,它通過將每個項目與列表的其餘部分進行比較並將其插入正確的位置,來一次構建一個列表。此「插入」過程為算法命名。一個很好的類比來解釋插入排序是您對一副紙牌進行排序的方式。想像一下,您手裡拿著一組卡片,並且想要按順序排列它們。首先,將一張卡片與其餘卡片進行逐步比較,直到找到正確的位置為止。
  • 一文圖解 Java 源碼的插入排序算法
    這就是插入排序的原理。插入排序(insertion sort)具體代碼,可以自行試試四、Array.sort 源碼中的插入排序上面用自己實現的插入算法進行排序,其實 JDK 提供了 Array.sort 方法,方便排序。
  • 算法一看就懂之「 插入排序 」
    「 插入排序 」與「 冒泡排序 」一樣都屬於時間複雜O(n*n)的排序算法,並且也都是基於元素之間比較的方式來完成排序的。不過「 插入排序 」比「 冒泡排序 」在實際應用中更廣泛一些,因為它的執行效率更高一點。一、「 插入排序 」是什麼?
  • 排序算法專題之插入排序
    經典插入排序例題1.使用插入排序算法對列表a升序排序。函數名:insert_sort(a)參數表:a -- 待排序列表。返回值:該方法沒有返回值,但是會對列表的對象進行升序排序。算法思想:外層循環控制待排序數組的左邊界,即a[i:]為待排序部分;內層循環掃描a[:i],將元素a[i]插入到適當位置def insert_sort (a):    for i in range(1, len(a)):        t, j =  ①                           while j >
  • 【第3篇 | 數據結構與算法】一舉消滅十大常見(常考)排序算法(原理+動圖+代碼+)
    第1篇 | 算法複雜度分析(必會)第2篇 | 一文複習完7種數據結構(原理+代碼)正文共計6000+字,19張講解算法圖片,14張代碼截圖,所有代碼均可在筆者的GitHub(https://github.com/econe-zhangwei
  • 排序算法 --- 插入排序
    排序過程中每次從無序表中取出第一個元素,把它的排序碼依次與有序表元素的排序碼比較,將它插入適當的位置,使之成為新的有序表。1.第一次:讓3和有序表最後一個元素17比較,發現3比17小,那麼就讓17往後挪一位,然後讓3再和前面的比較,發現前面沒有元素了,所以第一次排序後的結果是:3*   17*    25   14   20   9第二次:讓25和17比較,發現25比17大,那麼就不用變換位置,第二次排序後的結果是:
  • 圖解C語言冒泡排序算法,含代碼分析
    冒泡排序算法的原理
  • 十大經典排序算法大梳理 (動圖+代碼)
    時間、空間複雜度比較排序算法平均時間複雜度最差時間複雜度空間複雜度數據對象穩定性冒泡排序O(n2)O(n2)O(1)穩定選擇排序O(n2)O(n2)O(1)數組不穩定、鍊表穩定插入排序O(n2)O(n2)O(1)穩定快速排序O(n*log2n)O(n2)O(log2n)不穩定堆排序O(n*log2n)O(n*log2n)O(1)不穩定歸併排序O(n*log2n)O(n*log2n)O(n)穩定希爾排序
  • 五十五、深入插入排序和選擇排序
    「@Author:Runsen」插入排序插入排序(英語:Insertion Sort)是一種簡單直觀的排序算法。一個有序的數組,我們往裡面添加一個新的數據後,如何繼續保持數據有序呢?很簡單,我們只要遍歷數組,找到數據應該插入的位置將其插入即可。圖片來自王爭算法專欄通過構建有序序列,對於未排序數據,在已排序序列中從後向前掃描,找到相應位置並插入。插入排序在實現上,在從後向前掃描過程中,需要反覆把已排序元素逐步向後挪位,為最新元素提供插入空間。
  • 十大經典排序算法(動態演示+代碼)!乾貨收藏
    算法思想:從第一個元素開始,該元素可以認為已經被排序取出下一個元素,在已經排序的元素序列中從後向前掃描如果該元素(已排序)大於新元素,將該元素移到下一位置重複步驟3,直到找到已排序的元素小於或者等於新元素的位置將新元素插入到該位置後
  • 十大經典排序算法(動圖+代碼)
    (Heapsort)是指利用堆這種數據結構所設計的一種排序算法。,也稱遞減增量排序算法,是插入排序的一種更高效的改進版本。但希爾排序是非穩定排序算法。先將整個待排序的記錄序列分割成為若干子序列分別進行直接插入排序.選擇一個增量序列t1,t2,…,tk,其中ti>tj,tk=1;每趟排序,根據對應的增量ti,將待排序列分割成若干長度為m 的子序列,分別對各子表進行直接插入排序。僅增量因子為1 時,整個序列作為一個表來處理,表長度即為整個序列的長度。