插入排序中的直接插入排序和希爾排序

2021-09-28 11:11:15 字數 2342 閱讀 1068

一:插入排序中的直接插入排序:

直接插入排序,是最基本的插入排序演算法,個人感覺就和打牌一樣,手裡的牌分為兩塊,一塊有序,往往放在左邊,另一塊是無序的,需要把每張去慢慢調整,所以就做起了把每張牌向左邊有序塊插入的動作。

舉個例子:比如陣列

第一次插入:因為要左邊有序,所以預設假設陣列第一位後的元素是無序的,從陣列第二位開始,取第二位34,與第一位101作比較,發現小於,所以插入後是,34,101,119,1,有序塊增加一位;

同理第二第三次,每次都與前面的有序塊作比較,第二次插入:取119比較前面的有序塊,34,101,119,1; 第三次插入:取1,與前面的有序塊的每一位挨個比較,(此處的規則在下面說明),總之插入完後,結果為1,34,101,119那麼問題來了,需要哪些變數?

通過上面說明,發現需要待插入元素insertval,待插入的位置insertindex,但是待插入元素的位置又不好確定,通過例子,發現待插入元素每一次開始比較都要和前乙個元素(即有序塊的最後乙個元素)比較,那麼可以預設insertindex的位置時待插入元素的前乙個元素的位置。那如果比較後要插入,那咋辦啊?(此處是直接插入排序的核心)

可以用移位法,比如第一次插入,待插入元素剛好比前乙個元素小,可以先用中間變數儲存indexval,然後把前乙個元素後移,即往後複製一位實現後移,最後把中間變數賦給待插入的位置。那麼如果有序塊裡有若干個元素呢,則用迴圈,如果符合判斷條件,待插入位置後面的有序塊的元素都要往後移一位, 使用while迴圈,但迴圈執行完,說明待插入的位置已經找到,但是此處也體現了插入排序的缺點,當插入資料量少時,效率慢。

以下是移位的**塊:

int insertval;  //待插入的數

int insertindex; //待插入的下標,待插入數的前一位

//insertindex>=0 :防止陣列越界 insertval=0 && insertval移位的問題解決後,插入排序也就大體完成了,**如下:

public static void insertsortexample(int arr)

說說增量怎麼取,預設每次/2,取得增量,即增量gap=gap/2,gap預設為陣列長度。

(1)第一次,增量為5,說明分組按陣列的間距為5分,分完後:,,,,,共五組,然後先使用交換法比較,即對應增量的兩數比較交換。

注意,雖然分組,但是是虛擬組,並不存在,都是按陣列下標-5分組的(因為**中從第6位開始的),**如下:

int temp=0;

//第一輪輪排序:將十個資料分為了10/2=5即(增量為5的)五組,(8,3),(9,5)(1,4)(7,6)(2,0)

for (int i = 5; i =0 ; j-=5) }}

system.out.println("第一輪希爾排序後:"+tostring(arr));

比較完成後,此陣列為:,若有疑惑,根據上面的增量即下標+5對比看

(2)第二次,增量為5/2=2,即間距為2,分完後:,

同理,**如下:

//第二輪:將五組資料繼續分為增量為5/2=2的兩組

for (int i = 2; i =0 ; j-=2) }}

system.out.println("第二輪希爾排序後:"+tostring(arr));

執行完成後,此陣列為:   ,+用來標註一下,便於理解。

(3)第三次:增量為2/2=1,說明間距為1,也就是就乙個陣列,即,則比較,得出排序好的陣列,**如下:

//第三輪:將兩資料繼續分為增量為2/2=1的一組

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

system.out.println("第三輪希爾排序後:"+tostring(arr));

通過上述(1)(2)(3),發現增量也是分的組數(因為增量即間距),而且增量gap也可作迴圈的判斷條件,整合**如下:

int temp=0;

for (int gap=arr.length/2;gap>0;gap/=2)}}

}system.out.println("希爾排序後:"+tostring(arr));

但是發現乙個問題,使用交換法需要使用三層for迴圈,比較笨重,於是可以改進,使用移動法即直接插入排序代替交換法,需要注意的是,此時待插入的位置可不是從待插入元素的前乙個位置開始,應該為增量(因為按增量分組的),為了方便,預設為待插入元素的下標,**如下:

for (int gap=arr.length/2;gap>0;gap/=2)

arr[j]=temp;}}

}system.out.println("希爾排序後:"+tostring(arr));

插入排序(直接插入排序 希爾排序)

直接插入排序 基本思想 假設待排序的數存放在陣列arr 1.n 中。初始時,arr 1 自成1個有序區,無序區為arr 2.n 從i 2起直至i n為止,依次將arr i 插入當前的有序區arr 1.i 1 中,生成含n個記錄的有序區。演算法複雜度 對於具有n個記錄的檔案,要進行n 1次排序 各種狀...

插入排序 直接插入排序 希爾排序

1.直接插入排序 兩個陣列,有序陣列和無序陣列。排序前 無序陣列裡面所有的值都是無序的,有序陣列沒有值 排序中 無序陣列中拿出乙個數,放到有序陣列當中,有序陣列拿到數,將其按照大小有序的插入到無序陣列中 排序後 無序陣列中沒有數,有序陣列中的數為有序的。假設有一組無序序列 r0,r1,rn 1。1 ...

插入排序 直接插入排序 希爾排序

一 直接插入排序 1.思想 直接排序法,可以分為兩個部分,一部分是有序的,一部分是無序的.從這個圖上,應該是能看清楚直接插入排序的思想了.將無序部分的第乙個與有序部分進行比較.從有序部分的後面向前面比較,然後不斷地挪動有序部分的資料的位置 static void insertsort listlis...