荷兰国旗排序问题对应的快速排序方法
2015-07-12 17:42
447 查看
荷兰的国旗是由红、白、蓝三种,问题为时间复杂度为o(n)的情况下,按颜色依次排为红、白、蓝三种。
代码的逻辑如下,并不复杂,所占用的空间复杂度为o(1)
红白蓝三种情况,如果再考虑一次的话其实是对应的大于、小于和等于三种情况。可以用这种方法实现对快排的改版,挑选出比关键字大的和小的数,分别放在左边和右边。但是相比快速排序partition方法,不易找出初始值,(这里的查找方法逻辑比较杂,通过判断两个数是否是需要交换的数,是的话则重新对关键字赋值。其实比较逻辑可以放在swap方法中,这里就不在赘述了。)
实验结果显示该方法的效率和快排相差小。
代码的逻辑如下,并不复杂,所占用的空间复杂度为o(1)
int *Test::Sort(int *k, int counts) { int j = 0, i = 0,n=counts-1; while (j<=n) { switch (k[j]) { case 0: swap(k[i], k[j]); i++; j++; break; case 1: j++; break; case 2: swap(k[j], k ); n--; break; } } return k; }
红白蓝三种情况,如果再考虑一次的话其实是对应的大于、小于和等于三种情况。可以用这种方法实现对快排的改版,挑选出比关键字大的和小的数,分别放在左边和右边。但是相比快速排序partition方法,不易找出初始值,(这里的查找方法逻辑比较杂,通过判断两个数是否是需要交换的数,是的话则重新对关键字赋值。其实比较逻辑可以放在swap方法中,这里就不在赘述了。)
int *Test::Compare_Sort(int *k,int low,int high) { int j = 0, i = 0, n = high; int keys=low; int index = k[low]; int values; while (j <= n) { values = k[j] - index; if (values < 0) { if (i == keys || j == keys) { if (j == keys) { swap(k[i],k[j]); keys = i; } else { if (i == keys) { swap( k[i], k[j]); keys =j; } } } if(j!=keys&&i!=keys) swap( k[i], k[j]); i++; j++; } if (values == 0) { j++; } if (values>0) { if (j == keys||n==keys) { if (j == keys) { swap( k , k[j]); keys = n; } else { if (n == keys) { swap( k , k[j]); keys = j; } } } if(n!=keys&&j!=keys) swap( k[j], k ); n--; } }
实验结果显示该方法的效率和快排相差小。
相关文章推荐
- 安装win7 32位系统出现的问题解决办法
- iOS基础(foundation)-常用结构体
- LeetCode228——Summary Ranges
- XJTU Summer Holiday Test 1(Divisibility by Eight-8的倍数)
- error:#5:cannotopensourceinputfile"stm32f10x_lib.h":Nosuchfileordirectory
- MFC : Transparent TreeCtrl from CTreeCtrl
- Linux 2.6 完全公平调度算法CFS(Completely Fair Scheduler) 分析
- [LeetCode] Implement Stack using Queues
- Spark
- 快速使用svn仓库
- 最短路径—Dijkstra算法和Floyd算法
- Struts2之数据标签(一)
- 腾讯云更改yum源
- 每个对象都有自己的由其他对象所构成的存储
- [leetcode] 147.Insertion Sort List
- RelativeLayout在ViewPager中的一个bug
- 交换排序之冒泡排序
- shell学习四十二天----使用touch更新文件时间
- jquery validation remote depends 验证触发条件
- 【线段树】 HDOJ 5283 Senior's Fish