曾经遇到的一个面试题,快速排序用链表实现,算法和以前的相似,需要注意一些细节处理
2012-08-31 14:37
806 查看
typedef struct nodes{ int data; struct nodes * next; } node; void add_node(node *first,int data) { node * tmp; if (first != NULL){ tmp =(node *) malloc(sizeof(node)); if (tmp != NULL) { tmp->data= data; tmp->next = NULL; } while ( first-> next != NULL) first = first->next; first->next = tmp; } } void print_link(node * first) { while (first){ printf("%d ",first->data); first=first->next; } printf("\n"); } node * partion_list(node *first, node * end, node * & ret_little ) { node *little=NULL,*big=NULL,*tmp=NULL; tmp = first; first = first->next; tmp->next = NULL; while (first != end) { if (tmp->data > first->data) { if (little == NULL) { little = first; first = first->next; little->next = NULL; } else { node * t = little; while ( t->next != NULL ) t = t->next; t->next = first; first = first->next; t->next->next=NULL; } } else { if (big == NULL) { big = first; first = first->next; big->next = NULL; } else { node * t = big; while ( t->next != NULL ) t = t->next; t->next = first; first = first->next; t->next->next=NULL; } } } node *t =little; while ( t != NULL && t->next != NULL ) t = t->next; if (little != NULL) { t->next=tmp; ret_little = little; } else { ret_little = tmp; } tmp->next = big; return tmp; } node * quick_list(node *first, node *end) { if ( first == NULL || first == end) return first; node * new_first=NULL; node * tmp = partion_list(first,end,new_first); print_link(new_first); node * p = new_first; if (new_first == tmp && tmp ->next == NULL) { printf("1\n"); return tmp; } else if (new_first == tmp) { printf("2\n"); node * end = quick_list(tmp->next,NULL); tmp->next = end; return tmp; } else if (tmp ->next == NULL) { printf("3\n"); p = new_first; while (p->next != tmp) p = p->next; p->next = NULL; node * start = quick_list(new_first,NULL); p = start; while ( p->next != NULL) p = p->next; p->next = tmp; return start; } else { printf("4\n"); p = new_first; while (p->next != tmp) p = p->next; p->next = NULL; node * start = quick_list(new_first,NULL); p = start; while ( p->next != NULL) p = p->next; p->next = tmp; node * end = quick_list(tmp->next,NULL); tmp->next = end; return start; } }
相关文章推荐
- 怎样编写一个程序,把一个有序整数数组放到二叉树中? 编写实现链表排序的一种算法。说明为什么你会选择用这样的方法?
- 字符串处理strlen函数需要注意的一些小细节问题
- 实现一个简单的c++ list容器(含sort排序 链表归并算法实现)
- 今天在看一些面试题的时候遇到的一个关于strcmp()返回值的细节问题
- MVC模式实现用户登录练习中遇到的问题和需要注意的细节
- 给定一个单向链表(长度未知),请设计一个既节省时间又节省空间的算法来找出该链表中的倒数第m个元素。实现这个算法,并为可能出现的特例情况安排好处理措施。“倒数第m个元素”是这样规定的:当m=0时,链表的
- 有N个正实数(注意是实数,大小升序排列) x1 , x2 ... xN,另有一个实数M。 需要选出若干个x,使这几个x的和与 M 最接近。 请描述实现算法,并指出算法复杂度
- 常见笔试面试题:实现一个递增排序的单链表
- 经典快速排序,linux纯C实现。注意swap方法,并且这个算法还需再敲写15篇。
- 笔试算法题(55):快速排序实现之三路划分, 三元中值法和插入排序处理小子文件
- 快速排序的一些实现技巧(曾经被手写快排打倒过n+1次。。。)
- Python 快速排序 堆排序——Python实现一些算法持续更新
- 快速排序的C#实现以及,算法导论上之后一个习题的思考
- 算法整理(二)---快速排序的两种实现方式:双边扫描和单边扫描
- 一些细节,需要注意;一些小错,难以察觉(Android SharedPreferences、Thread、Toast、AsyncTask)
- C语言 -- 二维数组得一些需要注意得细节
- 新手SqlServer数据库dba需要注意的一些小细节
- 啊哈!算法 - 桶排序,冒泡排序,快速排序 - PHP实现
- 算法代码实现之快速排序,Java实现
- 网易面试题之小易是一个数论爱好者,并且对于一个数的奇数约数十分感兴趣。一天小易遇到这样一个问题: 定义函数f(x)为x最大的奇数约数,x为正整数。 例如:f(44) = 11. 现在给出一个N,需要求