資料結構 選擇排序演算法和希爾排序演算法詳解

2021-10-06 12:40:31 字數 1882 閱讀 7058

選擇排序演算法是經典演算法之一,你可以想象你在打牌,每次拿到的一張牌就是待排序的一張,你需要每一次跟之前的牌進行比較,然後將這張牌插入到合適的位置。那麼選擇排序也是一樣,將整個陣列看成兩個部分,有序部分和無序部分。現在需要將無序部分的數字跟有序部分進行比較,插入到正確的位置

下列**是插入排序的內層迴圈:

while (insertindex >= 0 && insertval < arr[insertindex])
while迴圈中判斷用來控制當前數字是否比有序部分前乙個數字小,和必須要滿足有序部分的前乙個索引是大於0的否則就會出現越界。迴圈裡面進行數值的賦值。意義在於當判斷成立之後,則代表當前數字是比有序部分的數字小,那麼需要進行移位,即把前乙個數字賦值給後乙個數字,然後再將下標前移。下面放完整**:

public static void insertsort(int arr) 

arr[insertindex + 1] = insertval;

}}

最後來測試一下本演算法在處理10w條資料的處理時間

public static void main(string args) 

// system.out.println(arrays.tostring(arr));

******dateformat sdf = new ******dateformat("yyyy-mm-dd hh:mm:ss");

string start = sdf.format(new date());

system.out.println(start);

insertsort(arr);

string end = sdf.format(new date());

system.out.println(end);

}

最終的執行結果為:

但是選擇排序演算法是可以進行優化的,舉個例子

像現在這組資料,如果按照傳統的插入排序,最後一位數字進行判斷和移位時會出現大量移位。那麼為了解決這個問題就需要設定乙個步長,利用步長將陣列分為多個小陣列進行插入排序。這樣就可以將這個問題進行簡化。

具體**如下:

public static void shellsort(int arr) 

arr[j] = value;

}} }

}

**中第一層迴圈是控制步長迴圈,這樣就可以將陣列分為若干個小陣列,在步長為1時這時的陣列就變成了乙個基本有序的陣列,這樣再對這個陣列進行排序效率明顯就提公升了許多。

最後來測試一下本演算法在處理10w條資料的處理時間

public static void main(string args) 

// system.out.println(arrays.tostring(arr));

******dateformat sdf = new ******dateformat("yyyy-mm-dd hh:mm:ss");

string start = sdf.format(new date());

system.out.println(start);

shellsort(arr);

string end = sdf.format(new date());

system.out.println(end);

}

最終的執行結果為:

可以很明顯得看出這個演算法的效率還是很高的。

資料結構和演算法 排序演算法 希爾排序

希爾排序 希爾排序 希爾排序就是插入排序的一種改進版本,演算法的步驟 把乙個序列不視為乙個整體,而是視為多個子串行,假設間隔是gap 4 alist 54,26,93,17,77,31,44,55,20 54,26,93,17,77,31,44,55,20 54 77 20 這是1 組,間隔是4,2...

資料結構 演算法 希爾排序

希爾排序過程 希爾排序的基本思想是 將陣列列在乙個表中並對列分別進行插入排序,重複這過程,不過每次用更長的列 步長更長了,列數更少了 來進行。最後整個表就只有一列了。將陣列轉換至表是為了更好地理解這演算法,演算法本身還是使用陣列進行排序。def shell sort alist 希爾排序 n len...

演算法與資料結構 選擇,插入,希爾排序

首先來看比較簡單的選擇排序 selection sort 插入排序 insertion sort 然後在分析插入排序的特徵和缺點的基礎上,介紹在插入排序基礎上改進的希爾排序 shell sort 一 選擇排序 原理 現在假設我們給乙個隊伍排序。首先我們找到那個最矮的叫他站第一位,再找出第二矮的叫他站...