国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

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

2019-11-26 14:23:09
字體:
來源:轉載
供稿:網友

直接插入排序

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

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

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

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();  }}

打印結果:

201654152943341.png (442×96)

算法性能/復雜度
現在討論下直接插入算法的時間復雜度。無論輸入如何,算法總會進行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(

主站蜘蛛池模板: 永泰县| 元江| 客服| 开鲁县| 杂多县| 紫云| 若尔盖县| 合山市| 措勤县| 高雄县| 张家港市| 临高县| 桂东县| 济源市| 黑河市| 治多县| 阿巴嘎旗| 民丰县| 新安县| 定安县| 陇西县| 永新县| 永川市| 静乐县| 兰西县| 卫辉市| 济阳县| 兴化市| 鄂托克前旗| 中江县| 兖州市| 金门县| 道真| 信阳市| 抚州市| 吉安县| 武汉市| 太康县| 武平县| 大名县| 嵩明县|