插入排序
算法思想: 同样的我们对整个数组做一个待排序,跟已经排好序的划分,每次我们从待排序的数组首个元素开始,我们对这个元素在已经排序好的部分进行一个下坠处理,当这个元素比已经排序好的部分大(小)时,我们进行下坠(注意边界),直到这个元素来到已经排序好部分的相应位置。
手动模拟:
1 3 5 4 2 8 7 (对数组做划分,首次我们从下标idx = 1开始进行下坠,我们对 idx - 1(已排序数组的尾端),跟 idx 比较,然后进行下坠) |
---|
1 3 5 4 2 8 7 (第一次满足情况, idx 来到 2,进行下坠操作) |
1 3 5 4 2 8 7 (第二次满足情况, idx 来到 3,进行下坠操作) |
1 3 4 5 2 8 7 (第三次不满足,我们对4 进行下坠,直到达到相应位置不再下坠,idx 来到 4) |
下面我们看一下第四次的下坠过程:1 3 4 2 5 8 7 第一次下坠跟 5 交换;1 3 2 4 5 8 7 第二次下坠,跟 4 交换;最后来到相应位置 1 2 3 4 5 8 7 |
… |
1 2 3 4 5 7 8 |
最后代码实现:
void insertionSort( int arr[], int n ){
if( n <= 1 ){
return ;
}
for( int idx = 1; idx < n; ++ idx ){
for( int jdx = idx - 1; jdx >= 0 && arr[jdx] > arr[jdx + 1]; -- jdx ){
swap( arr[jdx], arr[jdx + 1] );
}
}
}