基本思想
将一个数据插入到已排序好的有序表中,从而得到一个新的、数据数增加1的有序表。
即:先将序列的第1个数据看成是一个有序的子序列,然后从第2个数据逐个进行插入,直至整个序列有序为止。
示例:
// 升序,左起
/*初始值*/ (3), 7, 5, 4, 2, 6, 1, 8, 9
/*第1趟*/ (3, 7), 5, 4, 2, 6, 1, 8, 9
/*第2趟*/ (3, 5, 7), 4, 2, 6, 1, 8, 9
/*第3趟*/ (3, 4, 5, 7), 2, 6, 1, 8, 9
/*第4趟*/ (2, 3, 4, 5, 7), 6, 1, 8, 9
/*第5趟*/ (1, 2, 3, 4, 5, 7), 6, 8, 9
/*第6趟*/ (1, 2, 3, 4, 5, 6, 7), 8, 9
/*第7趟*/ (1, 2, 3, 4, 5, 6, 7, 8), 9
/*第8趟*/ (1, 2, 3, 4, 5, 6, 7, 8, 9)
代码
// 基本实现
void printList(int *l, int n) {
for (int i = 0; i < n; i++) {
printf("%d ", l[i]);
}
printf("\n");
}
int main() {
int list[50] = { 3, 7, 5, 4, 2, 6, 1, 8, 9};
// 默认第一个已经插入,后面的节点往前面插入
for (int i = 1; i < 10; i++){
// 哨兵
int k = list[i];
// 要插入的位置
int index = i;
// 从已排序的最后一个点开始插入
for (int j = i - 1; j >= 0; j-- ) {
if ( list[j] > k ){
// 如果 j 节点的值大于 k,那么就将 j 节点后移一位,并更新插入位置
list[j + 1] = list[j];
index = j;
printList(list);
}
else {
break;
}
}
list[index] = k;
}
printList(list);
system("pause");
return 0;
}
// 优化
// 不设立哨兵,如果 i 比 i - 1 小那么就交换 i 和 i - 1,再 i --, 直到 i 为 0 或 i 比 i - 1 大
int main() {
int list[50] = { 3, 7, 5, 4, 2, 6, 1, 8, 9};
int l = lenth(list);
for (int i = 1; i < l; i++) { // 从 1 开始
for (int j = i; j > 0; j--) { //
if (list[j] < list[j - 1]) { // j 从 i 开始,向前遍历, 如果 j 比 j - 1 小, 那么就交换,否则退出循环
int k = list[j];
list[j] = list[j - 1];
list[j - 1] = k;
printList(list);
}
else {
break;
}
}
}
}
// 优化1 的优化,代码更少
int main() {
int list[50] = { 3, 7, 5, 4, 2, 6, 1, 8, 9};
int *tl = list + 1;
while (*tl != '\0') {
int *ti = tl;
int *tj = tl - 1;
int k = 0;
while (*ti < *tj) {
k = *ti;
*ti-- = *tj;
*tj-- = k;
printList(list);
}
tl++;
}
}
以上
原文链接 http://blog.csdn.net/u011546766/article/details/74024954