插入排序实现

83 篇文章 2 订阅
10 篇文章 0 订阅

排序原理

直接 插入 排序 的 基本 思想: 假设 待 排序 的 记录 存放 在 数组 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

草稿笔记

直接插入排序草稿笔记
直接插入排序草稿笔记

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值