a)插入排序分類:插入排序主要做兩件事,一是尋找插入點,二是移動插入點左側的資料;所以根據插入點的不同我們將插入排序又分為直接插入排序、折半插入排序和二路插入排序。
原理:我將依次遍歷陣列中的元素,將陣列分為「使用中的」和「待使用中的」兩部分,」在使用中的「資料時排序好的,「待使用中的」資料時未排序的,我們乙個乙個的將「待使用中的」資料插入到「使用中的」資料內。
演算法示圖:
陣列序列: [2] 5 1 4 3 //一般我們將陣列的第乙個數作為「使用中的」部分
第一次排序:[2
5] 1 4 3 //2<5,無需進行插入
第二次排序:[2 1
5] 4 3 //5>1,將1插到5的前面
[1 2 5] 4 3 //2>1,將1插到2的前面
第三次排序:[1
2 4 5] 3 //5>4,將4插到5的前面
[1 2 4 5] 3 //2<4,無需進行插入
第四次排序:[1 2 4 3 5] //5>3,將3插到5的前面
[1
2 3 4 5] //4>3,將3插到4的前面
[1 2 3 4 5] //2<3,無需進行插入
**實現:
觀察外層迴圈排序了四次,而array.length=5,所以外層迴圈次數為array.length-1次;再觀察內層迴圈,每次外層迴圈我們總是將「使用中」的部分與乙個固定數(temp)作比較,比較順序從「使用中」的部分的末尾開始到比temp小的數,設固定數的索引為i,則插入的條件為array[i-1]>temp,由此可見:
public static void insertionsort(int array)
array[j+1]=temp;
}}
c)、折半插入排序(binary insertion sort):折半插入排序其實是對直接插入排序的一種優化,和直接插入方法一樣,折半插入排序也是從第二個元素開始比較,只不過插入「使用中」的部分時的方法採用了和二分查詢演算法,將temp與「使用中」部分的中間乙個數進行比較,大於則往後繼續二分,小於則往前二分。
public static void insertion(int array)
for(int j=i-1;j>=low;j--)
array[low]=key;
} }
經典排序演算法 插入排序
插入的排序的原理是每趟將乙個數按照大小插入到它前面已經排好序的子串行中。依次重複,直到插入全部數字。以陣列 3,4,1,2 為例,公升序排列陣列。第一趟從第2個資料開始 第1個數字自己已經有序 跟前面乙個數字比較,如果小於前面數字就將前面數字後移,並繼續向前比較,直到下標小於0為止。如下圖所示 第二...
經典排序演算法(2) 插入排序演算法 希爾排序詳解
直接插入排序是一種最簡單的插入排序。插入排序 每一趟將乙個待排序的記錄,按照其關鍵字的大小插入到有序佇列的合適位置裡,直到全部插入完成。這個過程類似摸牌 假設有一組無序序列 r0,r1,rn 1。所以我們需要將 ri 和 r0 ri 1 進行比較,確定要插入的合適位置。這就需要乙個內部迴圈,我們一般...
經典排序演算法之 插入排序
插入排序的基本思想是將乙個記錄插入到已經排好序的有序表中,從而形成乙個新的有序表。對於少量元素的排序,插入排序是乙個有效的演算法。工作方式像許多人排序一副撲克牌,開始時,我們的左手為空並且桌子上的牌面向下。然後,我們每次從桌子上拿走一張牌並將它插人左手中正確的位置。為了找到一張牌的正確位置,我們從右...