荷兰国旗
来源:互联网 发布:网络协议分析与仿真 编辑:程序博客网 时间:2024/06/10 09:39
现有n个红白蓝三种不同颜色的小球,乱序排列在一起,请通过两两交换任意两个球,使得从左到右依次为红球、白球、蓝球。
可以借鉴快速排序的思路,先看三路快速排序的实现
三路快速排序法
适用于有大量重复元素的排序。
public class Quick3Way { public static void sort(Comparable[] a) { sort(a, 0, a.length-1); } private static void sort(Comparable[] a, int lo, int hi) { int M = 5; if(hi <= lo + M) //小数组切换到插入排序 { int N = hi - lo + 1; for(int i = 1; i < N; i++) { for(int j = i; j > 0 && less(a[j], a[j-1]); j--) exch(a, j, j-1); } return; } int lt = lo, i = lo + 1, gt = hi; Comparable v = a[lo]; while(i <= gt) { int cmp = a[i].compareTo(v); if(cmp < 0) exch(a, lt++, i++); else if(cmp > 0) exch(a, i, gt--); else i++; } sort(a, lo, lt-1); sort(a, gt + 1, hi); } private static boolean less(Comparable v, Comparable w) { return v.compareTo(w) < 0; } private static void exch(Comparable[] a, int i, int j) { Comparable t = a[i]; a[i] = a[j]; a[j] = t; } private static void show(Comparable[] a) { for(int i = 0; i < a.length; i++) System.out.print(a[i] + " "); System.out.println(); } public static boolean isSorted(Comparable[] a) { for(int i = 1; i < a.length; i++) if(less(a[i], a[i-1])) return false; return true; } public static void main(String[] args) { String[] a = {"S", "O", "R", "T", "E", "X", "A", "M", "P", "L", "E"}; sort(a); isSorted(a); show(a); }}
荷兰国旗问题三指针法
为了方便讨论,用数字0表示红球,数字1表示白球,数字2表示篮球。所以最后问题转换为数字排列0、1、2.
- 当current指针所指元素为0时,与begin指针所指元素交换,而后current++, begin++;
- 当current指针所指元素为1时,不做任何交换,而后current++;
- 当current指针所指元素为2时,与end指针所指元素交换,而后current指针不动,end–。
import java.util.Arrays;public class ThreePointSortTest { private static void ThreePointSort(int a[]) { int begin = 0; int current = 0; int end = a.length - 1; while(current <= end) { if(a[current] == 0) { int t = a[current]; a[current] = a[begin]; a[begin] = t; current++; begin++; } else if(a[current] == 1) current++; else { int t = a[current]; a[current] = a[end]; a[end] = t; end--; } } } public static void main(String[] args) { int a[] = {0,1,2,1,2,1,0,0,1,2,0,2,1}; ThreePointSort(a); System.out.println(Arrays.toString(a)); }}
0 0
- 荷兰国旗
- 荷兰国旗
- 荷兰国旗
- 荷兰国旗
- 荷兰国旗
- 荷兰国旗
- 荷兰国旗
- 荷兰国旗
- 荷兰国旗
- 荷兰国旗
- 荷兰国旗
- 荷兰国旗
- 荷兰国旗
- 荷兰国旗问题
- 荷兰国旗问题
- 【算法】荷兰国旗
- 荷兰国旗问题
- 荷兰国旗问题
- 面试
- 学习RAC小记-适合给新手看的RAC用法总结
- MDK临界区
- 关于nfs在ubuntu以及openwrt上的环境搭建
- Top K Frequent Elements
- 荷兰国旗
- 曝光融合Exposure Fusion 与ghost
- UINavigationBar 使用总结
- C++ explicit构造函数
- 用户空间与内核空间,进程上下文与中断上下文[总结]
- java 不让查询数据库sql一直在循环中执行的方法
- jquery $(document).ready() 与window.onload的区别
- 【NOI OJ】1818 红与黑
- 【数学建模】数据包络分析法