排序演算法 直接插入排序

2021-09-29 03:35:46 字數 1642 閱讀 9794

直接插入排序是插入排序演算法中最簡單的排序方法。

基本思想:依次將待排序序列中的每乙個記錄插入到乙個已經排好序的序列中。

簡單可以理解為:將待排序序列分為有序區和無序區,將無序區中每乙個記錄分別與有序區中記錄比較,找到合適位置插入到有序區中,如此進行,直至無序區沒有記錄,則待排序序列全部有序。

演算法開始時,由於不知道待排序區的有序區和無序區。因此可以將待排序序列第乙個記錄看作 有序區的第乙個記錄,待排序區除第乙個記錄外全部當作無序區看待。

此文排序按從小到大排序,反之亦然。

演算法過程: 從無序區選第乙個記錄(即原來待排序區的第二個記錄)與有序區第乙個記錄相比較,如果比有序區記錄小,則互換位置,無序區第乙個記錄進入有序區。如果比有序區記錄大,無序區第乙個記錄同樣進入有序區,後面元素開始比較。

需要注意的是後面元素比較時,需要從有序區最後乙個元素開始向前比較,因為插入排序時,需要考慮到插入前記錄的後移(即給待插入記錄留出插入的位置,需要將比該記錄大的記錄向後移乙個單位)如果從有序區第乙個元素開始比,找到插入位置後,該位置後面的記錄仍沒有辦法後移給給該記錄留出空位,因此不能從有序區第乙個元素開始比。

另外為了方便與有序區元素的比較,並且不會因為互換位置而影響序列的值,需要新增哨兵,將待插入的值賦予哨兵,讓哨兵去與有序區記錄比較。

例如: 初始待排序序列為:12   15   9    20   6   31    24

初始有序區: 12   無序區: 15   9    20   6   31    24

第一次演算法進行: 15>12 則          有序區: 12  15   無序區: 9  20  6  31  24

第二次:9<15  9<12         則           有序區: 9  12  15   無序區:20  6  31  24

第三次:20>15                                 有序區:9 12 15 20  無序區:6  31  24

第四次:6<20  6<15  6<12  6<9     有序區:6 9 12 15 20  無序區: 31 24

第五次:31>20                                 有序區: 6  9  12  15  20  31  無序區: 24

第六次: 24<31  24>20                    有序區:6  9  12  15  20  24  31    完成。

具體**實現:

1.  知道待排序序列元素個數,而且需要全部排序

public static void charu(int a,int n) {

int j;

int t=0; //哨兵

for(int i=1;i=0;j--) { //i-1為有序區最後乙個元素

if(t2.如果需要從控制台輸入待排序序列,或者只排序n個記錄

public static void charu(int a,int n) {

int j;

int t=0;

for(int i=1;i=0;j--) {

if(t區別在於構建函式的方式不同。

排序演算法 插入排序 直接插入排序

package 插入排序 直接插入排序 從後向前找到合適位置後插入 穩定 基本思想 每步將乙個待排序的記錄,按其順序碼大小插入到前面已經排序的字序列的合適位置 從後向前找到合適位置後 直到全部插入排序完為止。public class 直接插入排序 system.out.println 排序之前 fo...

排序演算法 插入排序 直接插入排序

當插入第i i 1 個元素時,前面的v 0 v i 1 等i 1個 元素已經有序。這時,將第i個元素與前i 1個元素v i 1 v 0 依次比較,找到插入位置即將v i 插入,同時原來位置上的元素向後順移。在這裡,插入位置的查詢是順序查詢。直接插入排序是一種穩定的排序演算法,其實現如下 public...

排序演算法 直接插入排序

思想 每次從無序表中取出第乙個元素,把它插入到有序表的合適位置,使有序表仍然有序。第一趟比較前兩個數,然後把第二個數按大小插入到有序表中 第二趟把第三個資料與前兩個數從前向後掃瞄,把第三個數按大小插入到有序表中 依次進行下去,進行了 n 1 趟掃瞄以後就完成了整個排序過程。演算法複雜度 如果目標是把...