1. 程式人生 > >C數據結構排序算法——直接插入排序法用法總結(轉http://blog.csdn.net/lg1259156776/)

C數據結構排序算法——直接插入排序法用法總結(轉http://blog.csdn.net/lg1259156776/)

所有 可能 app 必須 操作 itl 直接排序 works 技術分享

聲明:引用請註明出處http://blog.csdn.net/lg1259156776/

排序相關的的基本概念

  • 排序:將一組雜亂無章的數據按一定的規律順次排列起來。
    • 數據表( data list): 它是待排序數據對象的有限集合。
    • 排序碼(key):通常數據對象有多個屬性域,即多個數據成員組成,其中有一個屬性域可用來區分對象,作為排序依據。該域即為排序碼。每個數據表用哪個屬性域作為排序碼,要視具體的應用需要而定。
  • 分類
    • 內排序:指在排序期間數據對象全部存放在內存的排序;
    • 外排序:指在排序期間全部對象個數太多,不能同時存放在內存,必須根據排序過程的要求,不斷在內、外存之間移動的排序。

排序算法的分析

排序算法的穩定性

如果在對象序列中有兩個對象r[i]r[j] ,它們的排序碼k[i]==k[j] 。如果排序前後,對象r[i]r[j] 的相對位置不變,則稱排序算法是穩定的;否則排序算法是不穩定的。

排序算法的評價

時間開銷

  • 排序的時間開銷可用算法執行中的數據比較次數與數據移動次數來衡量。
  • 算法運行時間代價的大略估算一般都按平均情況進行估算。對於那些受對象排序碼序列初始排列及對象個數影響較大的,需要按最好情況和最壞情況進行估算

空間開銷

算法執行時所需的附加存儲。


插入排序(Insert Sorting)

基本思想

每步將一個待排序的對象,按其排序碼大小,插入到前面已經排好序的一組對象的適當位置上,直到對象全部插入為止。

分類

根據尋找插入位置方法分為

  • 直接插入排序
  • 折半(二分)插入排序
  • 希爾插入排序

直接插入排序

基本思想

當插入第i(i1)個對象時,前面的V[0],V[1],,V[i?1]已經排好序。這時,用V[i]的排序碼與V[i?1],V[i?2],,V[0]的排序碼順序進行比較,找到插入位置即將V[i]插入,原來位置上的對象向後順移。

直接插入排序圖示

技術分享圖片

從上到下,分別展示了直接排序算法的所有可能的過程,包括相同排序碼的排序方式(保持了原來的順序,說明是穩定排序)以及in-place操作中的元素移動等。

技術分享圖片

直接插入排序算法分析

設待排序對象個數為n,則該算法的主程序執行n?1排序碼比較次數和對象移動次數與對象排序碼的初始排列有關

  • 最好情況下,排序前對象已經按照要求的有序。比較次數(KCN):n?1 ; 移動次數(RMN):為0。則對應的時間復雜度為O(n)
  • 最壞情況下,排序前對象為要求的順序的反序。第i趟時第i個對象必須與前面i個對象都做排序碼比較,並且每做1次比較就要做1次數據移動(具體可以從下面給出的代碼中看出)。比較次數(KCN):n?1i=1i=n(n?1)2n22 ; 移動次數(RMN):為n?1i=1i=n(n?1)2n22。則對應的時間復雜度為O(n2)
  • 如果排序記錄是隨機的,那麽根據概率相同的原則,在平均情況下的排序碼比較次數和對象移動次數約為n24,因此,直接插入排序的時間復雜度O(n2)

直接插入排序算法的特點

  • 它是穩定排序,不改變相同元素原來的順序。
  • 它是in-place排序,只需要O(1)的額外內存空間。
  • 它是在線排序,可以邊接收數據邊排序。
  • 它跟我們牌撲克牌的方式相似。
  • 對小數據集是有效的。

To save memory, most implementations use an in-place sort that works by moving the current item past the already sorted items and repeatedly swapping it with the preceding item until it is in place.

C數據結構排序算法——直接插入排序法用法總結(轉http://blog.csdn.net/lg1259156776/)