[資料結構] 插入排序

來源:互聯網
上載者:User

標籤:

概述

  將一個資料插入到已經排好序的有序資料中,從而得到一個新的、個數加一的有序資料,演算法適用於少量資料的排序,是穩定的排序方法。

  插入排序又分為 直接插入排序 和 折半插入排序。

直接插入排序

  把待排序的紀錄按其關鍵碼值的大小逐個插入到一個已經排好序的有序序列中,直到所有的紀錄插入完為止,得到一個新的有序序列。

Java實現
    public static void insertSort(int a[]){          int j;       //當前要插入值的位置          int preJ;     //依次指向j前的位置          int key;       //後移時來暫存要插入的值        //從數組的第二個位置開始遍曆值          for(j=1;j<a.length;j++){              key=a[j];              preJ=j-1;              //a[preJ]比當前值大時,a[preJ]後移一位              while(preJ>=0 && a[preJ]>key){                  a[preJ+1]=a[preJ]; //將a[preJ]值後移        //這裡注意:  a[preJ+1]=a[j]=key,把插入值已經存在了 key中    //等於說, 留出來一個空白位置來實現依次後移(不會造成資料丟失問題)                preJ--;         //preJ前移              }            //找到要插入的位置或已遍曆完成((preJ=0)            a[preJ+1]=key;    //將當前值插入 空白位置        }      } 

 
  備忘很清楚,我就不多說了....

效率分析

  空間複雜度O(1)  
  
  平均時間複雜度O(n^2)

最差情況:反序,需要移動n*(n-1)/2個元素 ,已耗用時間為O(n^2)。
  
最好情況:正序,不需要移動元素,已耗用時間為O(n).

折半插入排序 

  直接插入排序中要把插入元素與已有序序列元素依次進行比較,效率非常低。 
  
  折半插入排序,使用使用折半尋找的方式尋找插入點的位置, 可以減少比較的次數,但移動的次數不變, 時間複雜度和空間複雜度和直接插入排序一樣,在元素較多的情況下能提高尋找效能。

Java實現
private static void binaryInsertSort(int[] a)      {          //從數組的第二個位置開始遍曆值            for(int i = 1; i < a.length; i++)  {              int key = a[i];           //暫存要插入的值                int pre = 0;              //有序序列開始和結尾下標申明            int last = i - 1;               // 折半尋找出插入位置 a[pre]            while(pre <= last)  {                  int mid = (pre + last) / 2;                                if(key < a[mid])  {                      last = mid - 1;                  } else {                      pre = mid + 1;                  }              }       //a[i]已經取出來存放在key中,把下標從pre + 1到 i-1的元素依次後移            for(int j = i; j >= pre + 1; j--)  {                  a[j] = a[j - 1];              }              //把值插入空白位置            a[pre] = key;                    }      } 

直接插入排序是,比較一個後移一個;
折半插入排序是,先找到位置,然後一起移動;

[資料結構] 插入排序

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.