選擇排序演算法是經典演算法之一,你可以想象你在打牌,每次拿到的一張牌就是待排序的一張,你需要每一次跟之前的牌進行比較,然後將這張牌插入到合適的位置。那麼選擇排序也是一樣,將整個陣列看成兩個部分,有序部分和無序部分。現在需要將無序部分的數字跟有序部分進行比較,插入到正確的位置
下列**是插入排序的內層迴圈:
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 一 選擇排序 原理 現在假設我們給乙個隊伍排序。首先我們找到那個最矮的叫他站第一位,再找出第二矮的叫他站...