热度 18
2013-8-21 16:26
1135 次阅读|
1 个评论
对比打扑克牌时抓牌的过程讲述插入排序的实现过程如下:每抓一张牌类似于从要排序的数组中顺序取出一个数,抓到牌后我们会将新抓到的牌和手中已经排好序(因为每抓一张牌都会进行排序所以手中的牌一直都是排好序的)的牌从右至左依次比对,如果新抓的牌比手中的某一张牌小(升序排列)那么将其和该张牌交换位置,直到将手中所有牌都比对一遍(其实并不需要完全比对,只需比对到新抓的牌比当前手中某一位置的牌大即可),如此等到抓完牌时,手中的牌已经是从小到大排好序的。我们将手中的牌暂定为数据队列,如果数组中有N个数,那么我们需要抓N-1次(单独一个数无法比对)并进行N-1次队列排序(每次队列排序实质上就是找出新抓的牌应该放在什么位置,对此我们采用的方法是将新抓的牌从右至左依次和队列中的数据比对直到和相邻的两个数的大小关系不一致时,说明新抓的牌应该插入这两个数之间)。具体程序代码如下: #include #define LEN 10 int a = {10, 5, 3, 4,2,1 ,3,5,8,90}; void insertion_sort() { int i = 0, j = 0, key = 0; for(j = 1; j LEN; j++) // 新抓一张牌 { for(i = j - 1; i = 0; i--) // 队列插入排序 { if(a a ) // 自右至左寻找插入点 { key = a ; a = a ; a = key; } else // 找到插入点后无需继续比对,提高程序效率 break; } } } int main() { int i = 0; for(i = 0; i LEN; i++) printf("%-4d",a ); printf("\n"); insertion_sort(); for(i = 0; i LEN; i++) printf("%-4d",a ); printf("\n"); return 0; }