扑克牌我们大部分人都玩过,当然也都知道该怎么把刚抓上来的牌放哪里,最后得到一手排好的牌。但其中所蕴含的算法原理
不知道你有没有想过。计算机科学家把人的这一直观想法翻译为计算机程序于是便有了我们所说的插入排序:
/************************************* 函数:插入排序 说明:对区间[low, high)的数据排序 时间复杂度:O(n + inverse) *************************************/ void insertionSort(int* low , int* high) { for(int* cur = low; ++cur < high; ) ///实际是从第二个元素开始插入,因为第一个已经有序了 { int tmp = *cur; ///临时保存要插入的值 int* destPos = cur; ///记录当前要插入的元素的正确安放位置,这里初始化为本来的位置 while(--destPos >= low && *destPos > tmp) ///测试上一个是否是目标位置 *(destPos + 1) = *destPos; *(destPos + 1) = tmp; ///最后一次测试失败使得destIndex比实际小1 } }这里使用指针作为输入参数是比输入元素个数是有优势的:常数更小,移植性更强。
void insertionSort(int* low , int* high) { int inverse = 0; ///逆序数 for(int* cur = low; ++cur < high; ) { int tmp = *cur; int* destPos = cur; while(--destPos >= low && *destPos > tmp) { *(destPos + 1) = *destPos; inverse++; ///修复一个逆序 } *(destPos + 1) = tmp; } }下面是测试数据(假设元素互异,且随机排列):
/************************************* 函数:优化版插入排序 说明:对区间[low, high)的数据排序 时间复杂度:O(n + inverse) *************************************/ void improvedInsertionSort(int* low , int* high) { for(int* cur = low; ++cur < high; ) ///实际是从第二个元素开始插入,因为第一个已经有序了 { int tmp = *cur; ///临时保存要插入的值 int* destPos = cur; ///记录当前要插入的元素的正确安放位置,这里初始化为本来的位置 ///把第一次测试单独提出来 if(*(--destPos) > tmp) { do { *(destPos + 1) = *destPos; }while(--destPos >= low && *destPos > tmp); ///测试上一个是否是目标位置 *(destPos + 1) = tmp; ///最后一次测试失败使得destIndex比实际小1 } } }
原文地址:http://blog.csdn.net/u010383982/article/details/42460383