排序原理
直接 插入 排序 的 基本 思想: 假设 待 排序 的 记录 存放 在 数组 R[ 1… n] 中。 初始 时, R[ 1] 自成 1 个 有序 区, 无序 区 为 R[ 2… n]。 从 i= 2 起 直至 i= n 为止, 依次 将 R[ i] 插入 当前 的 有序 区 R[ 1... i- 1] 中, 生成 含 n 个 记录 的 有序 区。
第 i- 1 趟 直接 插入 排序: 通常 将 一个 记录 R[ i]( i= 2,…, n- 1) 插入 到 当前 的 有序 区, 使得 插入 后仍 保证 该区 间里 的 记录 是按 关键字 有序 的 操作, 称为 第i- 1 趟 直接 插入 排序。 排序 过程 的 某一 中间 时刻, R 被 划分 成 两个 子 区间: R[ 1… i- 1]( 已 排好 序 的 有序 区) 和 R[ i… n]( 当前 未 排序 的 部分, 可称 为 无序 区)。 直接 插入 排序 的 基本 操作 是将 当前 无序 区 的 第 1 个 记录 R[ i] 插入 到 有序 区 R[ 1… i- 1] 中 适当 的 位置 上, 使 R[ 1… i] 变为 新的 有序 区。 因为 这种 方法 每次 使 有序 区 增加 1 个 记录, 通常 称为 增量 法。 插入 排序 与 打 扑克 时 整理 手上 的 牌 非常 类似。 摸 来的 第 1 张 牌 无须 整理, 此后 每次 从 桌上 的 牌( 无序 区) 中 摸 最上 面的 1 张 并 插入 左手 的 牌( 有序 区) 中 正确 的 位置 上。 为了 找到 这个 正确 的 位置, 须 自 左 向右( 或 自 右 向左) 将 摸 来的 牌 与 左手 中 已 有的 牌 逐一 比较。
实现插入排序
#include <stdio.h>
#include <stdlib.h>
#define SUCCESS 0
#define PARAM_ERR -1
int InsertSort(int * array, int size){
if(NULL == array){
printf("%s para error", __func__);
return PARAM_ERR;
}
int i = 0, j = 0;
int insert = 0;
int loc = 0;
#ifdef DEBUG
int k = 0;
#endif
for(i = 0; i < size; i++){
insert = array[i];
/*升序*/
/*insert 是最大的,不改变,进入下一轮插入排序*/
if(insert > array[i-1]){
goto info;
}
/*在有序区域查找合适的插入位置*/
loc = i-1; //初始插入位置认为在最后一个上
for(j = i - 1; j >= 0; j--){
if(insert >= array[j]){
#ifdef DEBUG
printf("find loc insert %d > array[%d] = %d\n", insert, j, array[j]);
#endif
break;
}
loc = j;
}
/*有序区从插入位置向后移动*/
for(j = i; j > loc; j--){
array[j] = array[j-1];
}
array[loc] = insert;
info:
#ifdef DEBUG
printf("i = %d insert = %d, loc = %d\n", i, insert, loc);
printf("[");
/*有序区域*/
for(k =0; k < i+1; k++){
printf(" %d ", array[k]);
}
printf("] ");
/*无序区域*/
printf("[");
for(k =i+1; k < size; k++){
printf(" %d ", array[k]);
}
printf("]\n");
printf("\n");
#endif
continue;
}
return SUCCESS;
}
int main(int argc, char ** argv){
int array[10] = {7,3,5,8,0,9,1,2,4,6};
int i = 0;
printf("Before sort: \n");
for(i = 0; i < 10; i++){
printf(" %d ", array[i]);
}
printf("\n");
InsertSort(array, 10);
printf("after sort: \n");
for(i = 0; i < 10; i++){
printf(" %d ", array[i]);
}
printf("\n");
return 0;
}
正常编译
gcc InsertSort.c
输出
Before sort:
7 3 5 8 0 9 1 2 4 6
after sort:
0 1 2 3 4 5 6 7 8 9
调试编译:
gcc InsertSort.c -DDEBUG
输出:
输出格式
[有序区域][无序区域]
Before sort:
7 3 5 8 0 9 1 2 4 6
i = 0 insert = 7, loc = 0
[ 7 ] [ 3 5 8 0 9 1 2 4 6 ]
i = 1 insert = 3, loc = 0
[ 3 7 ] [ 5 8 0 9 1 2 4 6 ]
find loc insert 5 > array[0] = 3
i = 2 insert = 5, loc = 1
[ 3 5 7 ] [ 8 0 9 1 2 4 6 ]
i = 3 insert = 8, loc = 1
[ 3 5 7 8 ] [ 0 9 1 2 4 6 ]
i = 4 insert = 0, loc = 0
[ 0 3 5 7 8 ] [ 9 1 2 4 6 ]
i = 5 insert = 9, loc = 0
[ 0 3 5 7 8 9 ] [ 1 2 4 6 ]
find loc insert 1 > array[0] = 0
i = 6 insert = 1, loc = 1
[ 0 1 3 5 7 8 9 ] [ 2 4 6 ]
find loc insert 2 > array[1] = 1
i = 7 insert = 2, loc = 2
[ 0 1 2 3 5 7 8 9 ] [ 4 6 ]
find loc insert 4 > array[3] = 3
i = 8 insert = 4, loc = 4
[ 0 1 2 3 4 5 7 8 9 ] [ 6 ]
find loc insert 6 > array[5] = 5
i = 9 insert = 6, loc = 6
[ 0 1 2 3 4 5 6 7 8 9 ] []
after sort:
0 1 2 3 4 5 6 7 8 9
草稿笔记
![直接插入排序草稿笔记](https://img-blog.csdnimg.cn/20200212203354399.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xlb3VmdW5n,size_16,color_FFFFFF,t_70)