激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - 詳解直接插入排序算法與相關的Java版代碼實現

詳解直接插入排序算法與相關的Java版代碼實現

2020-04-24 12:34飛翔的貓咪 JAVA教程

這篇文章主要介紹了直接插入排序算法與相關的Java版代碼實現,需要的朋友可以參考下

直接插入排序

直接插入排序的思路很容易理解,它是這樣的:
1.把待排序的數組分成已排序和未排序兩部分,初始的時候把第一個元素認為是已排好序的。
2.從第二個元素開始,在已排好序的子數組中尋找到該元素合適的位置并插入該位置。
3.重復上述過程直到最后一個元素被插入有序子數組中。
4.排序完成。

示例:
思路很簡單,但代碼并非像冒泡排序那么好寫。首先,如何判斷合適的位置?大于等于左邊、小于等于右邊?不行,很多邊界條件需要考慮,而且判斷次數太多。其次,數組中插入元素,必然需要移動大量元素,如何控制它們的移動?
實際上,這并不是算法本身的問題,而多少和編程語言有點關系了。有時候算法本身已經很成熟了,到了具體的編程語言還是要稍作改動。這里講的是Java算法,那就拿Java說事兒。
為了解決上述問題,我們對第二步稍作細化,我們不從子數組的起始位置開始比較,而從子數組尾部開始逆序比較,只要比需要插入的數大,就向后移動。直到不大于該數的數,那么,這個空出來的位置就安放需要插入的數字。因此,我們可以寫出以下代碼:
InsertArray.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
public class InsertArray {
  // 數組
  private long[] arr;
 
  // 數組中有效數據的大小
  private int elems;
 
  // 默認構造函數
  public InsertArray() {
    arr = new long[50];
  }
 
  public InsertArray(int max) {
    arr = new long[max];
  }
 
  // 插入數據
  public void insert(long value) {
    arr[elems] = value;
    elems++;
  }
 
  // 顯示數據
  public void display() {
    for (int i = 0; i < elems; i++) {
      System.out.print(arr[i] + " ");
    }
    System.out.println();
  }
 
  // 插入排序
  public void insertSort() {
    long select = 0L;
    for(int i = 1; i < elems; i++) {
      select = arr[i];
      int j = 0;
      for(j = i;j > 0 && arr[j - 1] >= select; j--) {
        arr[j] = arr[j - 1];
      }
      arr[j] = select;
    }
  }
}

測試類:
TestInsertArray.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class TestInsertArray {
  public static void main(String[] args) {
    InsertArray iArr = new InsertArray();
    iArr.insert(85);
    iArr.insert(7856);
    iArr.insert(12);
    iArr.insert(8);
    iArr.insert(5);
    iArr.insert(56);
 
    iArr.display();
    iArr.insertSort();
    iArr.display();
  }
 
}

打印結果:

詳解直接插入排序算法與相關的Java版代碼實現

算法性能/復雜度
現在討論下直接插入算法的時間復雜度。無論輸入如何,算法總會進行n-1輪排序。但是,由于每個元素的插入點是不確定的,受輸入數據影響很大,其復雜度并不是一定的。我們可以分最佳、最壞、平均三種情況討論。
1.最佳情況:由算法特點可知,當待排數組本身即為正序(數組有序且順序與需要的順序相同,于我們的討論前提,即為升序)時為最佳,理由是這種情況下,每個元素只需要比較一次且無需移動。算法的時間復雜度為O(n);
2.最壞情況:很顯然,當待排數組為逆序時為最壞情況,這種情況下我們的每輪比較次數為i-1, 賦值次數為i。總的次數為級數2n-1的前n項和,即n^2.算法的時間復雜度為O(n^2);
3.平均情況:由上述分析可以得到平均情況下算法的運算次數大約為(n^2)/2(注:這里計算以賦值和比較計,若按移動和比較,則大約為n^2/4),顯然,時間復雜度還是O(n^2)。
至于算法的空間復雜度,所有移動均在數據內部進行,唯一的開銷是我們引入了一個臨時變量(有的數據結構書上稱為“哨兵”),因此,其空間復雜度(額外空間)為O(1)。

算法穩定性
由于只需要找到不大于當前數的位置而并不需要交換,因此,直接插入排序是穩定的排序方法。

算法變種
如果待排列的數據比較多,那么每次從后往前找就造成了很大的開銷,為了提高查找速度,可以采用二分查找(Binary Search)進行性能優化。由于二分查找的效率很高,保證了O(㏒n)復雜度,在數據比較多或輸入數據趨向最壞情況時可以大幅提高查找效率。在有些書上將這種方法稱為折半插入排序。它的代碼實現比較復雜,以后有時間可以貼出來。
此外,還有2-路插入排序和表插入排序。2-路插入排序是在折半插入排序的基礎上進一步改進,其移動次數大為降低,大約為n^2/8。但是,它并不能避免移動次數,也不能降低復雜度級別。表插入排序則完全改變存儲結構,不移動記錄,但需要維護一個鏈表,以鏈表的指針修改代替移動記錄。因此,其復雜度仍然是O(n^2)。
有關2-路插入排序和表插入排序,可以參考嚴蔚敏、吳偉民編著的《數據結構》一書。

算法適用場景
插入排序由于O(n^2)的復雜度,在數組較大的時候不適用。但是,在數據比較少的時候,是一個不錯的選擇,一般做為快速排序的擴充。例如,在STL的sort算法和stdlib的qsort算法中,都將插入排序作為快速排序的補充,用于少量元素的排序。又如,在JDK 7 java.util.Arrays所用的sort方法的實現中,當待排數組長度小于47時,會使用插入排序。

 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 免费一级毛片在线播放视频老 | 精品成人久久久 | 欧美性生活久久久 | 久久精品亚洲欧美日韩精品中文字幕 | 亚洲欧美一区二区三区在线观看 | 久草视频2 | 91精品视频在线看 | 69av导航| 色屁屁xxxxⅹ免费视频 | 黄色av电影在线 | 91av在线影院| jizzjizz中国少妇中文 | 久久久久久久久久久影视 | 午夜视频中文字幕 | 国产寡妇xxxxxxxx性开放 | 黄色久| 久久久久久久一区二区 | 999久久久国产999久久久 | 国产资源在线免费观看 | av在线影片 | 国产羞羞视频在线观看 | 19禁国产精品福利视频 | 日韩一级片黄色 | 欧美三级欧美成人高清www | 911色_911色sss主站色播 | 国产精品成人一区 | 国产一国产精品一级毛片 | 欧美成在线视频 | 久久人人做 | 电影一级毛片 | 悠悠成人资源亚洲一区二区 | 日日久视频 | 国内精品久久久久久久影视红豆 | 在线免费日韩 | 久久精品网址 | 欧美重口另类videos人妖 | 久草在线免费看 | 欧美一级三级在线观看 | 国产精品一区二区免费在线观看 | 最新一区二区三区 | 羞羞视频免费入口网站 |