直接插入排序是插入排序演算法中最簡單的排序方法。
基本思想:依次將待排序序列中的每乙個記錄插入到乙個已經排好序的序列中。
簡單可以理解為:將待排序序列分為有序區和無序區,將無序區中每乙個記錄分別與有序區中記錄比較,找到合適位置插入到有序區中,如此進行,直至無序區沒有記錄,則待排序序列全部有序。
演算法開始時,由於不知道待排序區的有序區和無序區。因此可以將待排序序列第乙個記錄看作 有序區的第乙個記錄,待排序區除第乙個記錄外全部當作無序區看待。
此文排序按從小到大排序,反之亦然。
演算法過程: 從無序區選第乙個記錄(即原來待排序區的第二個記錄)與有序區第乙個記錄相比較,如果比有序區記錄小,則互換位置,無序區第乙個記錄進入有序區。如果比有序區記錄大,無序區第乙個記錄同樣進入有序區,後面元素開始比較。
需要注意的是後面元素比較時,需要從有序區最後乙個元素開始向前比較,因為插入排序時,需要考慮到插入前記錄的後移(即給待插入記錄留出插入的位置,需要將比該記錄大的記錄向後移乙個單位)如果從有序區第乙個元素開始比,找到插入位置後,該位置後面的記錄仍沒有辦法後移給給該記錄留出空位,因此不能從有序區第乙個元素開始比。
另外為了方便與有序區元素的比較,並且不會因為互換位置而影響序列的值,需要新增哨兵,將待插入的值賦予哨兵,讓哨兵去與有序區記錄比較。
例如: 初始待排序序列為: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 趟掃瞄以後就完成了整個排序過程。演算法複雜度 如果目標是把...