插入排序的基本操作就是將一個數(shù)據(jù)插入到已經(jīng)排好序的有序數(shù)據(jù)中摊册,從而得到一個新的、個數(shù)加一的有序數(shù)據(jù)颊艳。插入排序方法分直接插入排序和折半插入排序兩種茅特。查看完整代碼
一、直接插入排序
1棋枕、直接插入排序是一種簡單的插入排序法白修,其基本思想是:把待排序的元素按其元素值的大小逐個插入到一個已經(jīng)排好序的有序序列中,直到所有的記錄插入完為止重斑,得到一個新的有序序列
2兵睛、算法步驟:
(1)、從待排序的第二個元素開始窥浪,向下掃描列表卤恳,比較這個目標(biāo)值target與arr[i-1]、arr[i-2]的大小寒矿,依次類推突琳。如果target的值小于或等于每一個元素值,那么每個元素都會向右滑動一個位置符相,一旦確定了正確位置j拆融,目標(biāo)值target(即原始的arr[i])就會被復(fù)制到這個位置蠢琳。
3、實例圖解:
4镜豹、算法分析:
時間復(fù)雜度:當(dāng)元素初始化就是正序排列的傲须,時間復(fù)雜度為O(N),當(dāng)元素初始化是逆序的趟脂,時間復(fù)雜度為O(N^2),所以平均時間復(fù)雜度為O(N^2)
空間復(fù)雜度:在直接插入排序中只使用了i,j,temp這3個輔助元素泰讽,與問題規(guī)模無關(guān),所以空間復(fù)雜度為O(1).
穩(wěn)定性:在整個排序結(jié)束后昔期,即使有相同元素它們的相對位置也沒有發(fā)生變化已卸,所以直接插入排序是一種穩(wěn)定排序。
二硼一、折半插入排序
1累澡、折半插入排序的基本思想與直接插入排序一樣,在插入第i(i≥1)個元素時般贼,前面i?1個元素已經(jīng)排好序愧哟。區(qū)別在于尋找插入位置的方法不同,折半插入排序是采用折半查找法來尋找插入位置的哼蛆。
2蕊梧、算法步驟:
(1)計算 0 ~ i-1 的中間點,用 temp臨時變量元素與中間值進(jìn)行比較腮介,如果temp元素大肥矢,說明要插入的這個元素應(yīng)該在中間值和temp對應(yīng)的i之間,反之萤厅,就是在i到中間值的位置橄抹,這樣很簡單的完成了折半;
(2)在相應(yīng)的半個范圍里面找插入的位置時惕味,不斷的用(1)步驟縮小范圍楼誓,不停的折半,從而快速的確定出第 i 個元素要插在什么地方名挥;
(3)確定位置之后疟羹,將整個序列后移,并將元素插入到相應(yīng)位置禀倔。
3榄融、算法分析:
時間復(fù)雜度:折半插入排序適合記錄數(shù)較多的場景,與直接插入排序相比救湖,折半插入排序在尋找插入位置上面所花的時間大大減少愧杯,但是折半插入排序在記錄移動次數(shù)方面和直接插入排序是一樣的,所以其時間復(fù)雜度為O(N^2)鞋既。其次力九,折半插入排序的記錄比較次數(shù)與初始序列無關(guān)耍铜。因為每趟排序折半尋找插入位置時,折半次數(shù)是一定的跌前,折半一次就要比較一次棕兼,所以比較次數(shù)也是一定的。
空間復(fù)雜度:同直接插入排序一樣抵乓,為O(1)伴挚。
穩(wěn)定性:折半插入排序是一種穩(wěn)定的排序算法。