荷兰国旗-快速排序应用

Posted ItSwag

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了荷兰国旗-快速排序应用相关的知识,希望对你有一定的参考价值。

荷兰国旗

”荷兰国旗难题“是计算机科学中的一个程序难题,它是由Edsger Dijkstra提出的。荷兰国旗是由红、白、蓝三色组成的。现有红白蓝三个不同颜色的小球,乱序排列在一起,请重新排列这些小球,使得红白蓝三色的同颜色的球在一起。 ps:我们可以将红白蓝三色小球想象成条状物,有序排列后正好组成荷兰国旗。



分析

arr[i]< key时相当于“荷兰国旗问题”中的0 arr[i]= key时相当于“荷兰国旗问题”中的1 arr[i]> key时相当于“荷兰国旗问题”中的2

这样就可以使用“荷兰国旗问题”的解法来解决快速排序了,这样一来,即使待排序的元素中有一些元素和key一样,也能保证时间复杂度是最差是NlogN的,因为对于待排序的等于Key的数值,可以在执行下一次Partition时直接跳过,利于数据规模的降低。


代码

 
   
   
 
  1. public class NetherlandsFlag {


  2. public static int[] partition(int[] arr,int L,int R,int p) {

  3. int less = L-1;

  4. int more = R+1;

  5. while(L < more) {

  6. if(arr[L] < p) {

  7. swap(arr,++less,L++);

  8. }else if(arr[L] > p) {

  9. swap(arr,--more,L);

  10. }else {

  11. L++;

  12. }


  13. }

  14. return new int[] {less+1,more-1};


  15. }


  16. public static void swap(int[] arr, int i, int j) {

  17. int temp = arr[i];

  18. arr[i] = arr[j];

  19. arr[j] = temp;


  20. }

  21. public static int[] getArray() {

  22. int arr[] = new int[10];

  23. for(int i = 0;i < arr.length;i++) {

  24. arr[i] = (int)(Math.random()*3);

  25. }

  26. return arr;

  27. }

  28. public static void printArray(int arr[]) {

  29. if(arr == null) {

  30. return ;

  31. }

  32. for(int i = 0;i < arr.length;i++) {

  33. System.out.print(arr[i]+" ");

  34. }

  35. System.out.println();


  36. }

  37. public static void main(String args[]) {

  38. int test[] = getArray();

  39. printArray(test);

  40. int res[] = partition(test,0,test.length-1,1); //p值为1,用来判断0,1,2

  41. printArray(test);

  42. System.out.println(res[0]);

  43. System.out.println(res[1]);

  44. }


  45. }


以上是关于荷兰国旗-快速排序应用的主要内容,如果未能解决你的问题,请参考以下文章

八大基本排序---快速排序(荷兰国旗问题)

那些可以用快速排序秒杀的经典题

LeetCode 数组:75. 颜色分类(计数排序 荷兰国旗问题)

编程之法:面试和算法心得(荷兰国旗)

小和问题与荷兰国旗问题

sort color (荷兰国旗)