一、原理
对于长度为n的数组,遍历其中元素,并且将其插入其之前一段有序数据中合适的位置。
二、程序
(1)从第1个数据取起,向其之前(第0个、…)查找第一个小于该数据的位置为i;
(2)将i之后的元素向后转移1位;
(3)将该元素放入第i+1位。
三、实现
#include <cstdio>
int main() {
int n;
scanf("%d", &n);
int data[n + 5];
int i;
for(i = 0; i < n; i++) {
scanf("%d", &data[i]);
}
int j, k, temp;
for(i = 1; i < n; i++) {
for(j = i - 1; j >= 0; j--) if(data[j] < data[i]) break; // 取得插入a[i]的合适位置为j
if(j != i - 1) {
temp = data[i];
for(k = i - 1; k > j; k--) {
data[k + 1] = data[k];
}
data[k + 1] = temp;
}
}
for(i = 0; i < n; i++) {
printf("%d ", data[i]);
}
return 0;
}
四、思考
还有什么可以减少时间消耗的方法?
参考:优化的直接插入排序(二分查找插入排序,希尔排序) - 滴答的雨
排序算法:希尔排序(优化插入排序)(By KSkun)