插入排序(Straight Insertion Sort): 基本操作是將一個記錄插入到已經排好的有序表中,從而得到一個新的,記錄數增1的有序表。
代碼如下:
- (void)logInsertionSortingArray {
NSMutableArray * arr = @[@(16),@(1),@(2),@(9),@(7),@(12),@(5),@(3),@(8),@(13),@(10)].mutableCopy;
for (int i = 1; i < arr.count; i++) {
int j = i; /* j是一個坑, 確定坑的位置,再把數從坑里取出來,注意順序*/
id temp = arr[i]; /* temp 是從坑里取數*/
if ([arr[i] intValue]< [arr[i-1] intValue]) { /* j > 0 防止越界。寫&&前面效率更高*/
while (j > 0 && [temp intValue] < [arr[j-1] intValue]) {
arr[j] = arr[j-1];
j--;
}
arr[j] = temp;
}
}
}
效果圖如下:
對上圖解釋如下:
從第二個開始,取出該位置的值為臨時值temp,位置為j,此時j的位置為空,叫做坑,然后temp依次往前比較,直到找到比temp小,把temp插入該的位置,完成一次循環。
插入排序復雜度分析:
從空間上來看,它只需要一個記錄的輔助空間,因此關鍵是看它的時間復雜度。當最好的情況,時間復雜度為O(n)。當最壞的情況,即待排序表示逆序的情況,如{6,5,4,3,2},此時需要比較(n+2)(n-1)/2次,記錄的移動次數也達到(n+4)(n-1)/2次。如果排序記錄是隨機的,那么根據概率相同的原則,平均比較和移動次數約為n2/4次,因此插入排序法的時間復雜度為O(n2),該排序比冒泡和選擇排序的性能要好一些。
上一篇:iOS算法總結-選擇排序
下一篇:iOS算法總結-希爾排序