当前位置:   article > 正文

三色排序问题/(荷兰国旗问题)(C++版)_三色排序 c++

三色排序 c++


题目:

有一个只由0,1,2三种元素构成的整数数组,请使用交换、原地排序而不是使用计数进行排序。

给定一个只含0,1,2的整数数组A及它的大小,请返回排序后的数组。

算法复杂度:

时间 O(N)

空间 O(1)


贴代码:

  1. void swap(int *p1, int *p2)
  2. {
  3. int temp = *p1;
  4. *p1 = *p2;
  5. *p2 = temp;
  6. }
  7. vector<int> sortThreeColor(vector<int> A, int n)
  8. {
  9. // 0 区域 2区域
  10. int idx0 = 0, idx2 = n - 1;
  11. for(int i = 0; i < n;)
  12. {
  13. // ==0 交换当前元素和0区的下一个位置(右) 遍历下一个
  14. if(A[i] == 0)
  15. {
  16. swap(&A[i], &A[idx0]);
  17. idx0++;
  18. ++i;
  19. }
  20. // ==2 交换当前元素和2区的下一个位置(左)
  21. else if(A[i] == 2)
  22. {
  23. // 还未遍历到2区 交换
  24. if (i < idx2)
  25. {
  26. swap(&A[i], &A[idx2]);
  27. idx2--;
  28. }
  29. // 否则 直接遍历下一个
  30. else
  31. {
  32. ++i;
  33. }
  34. }
  35. // ==1 遍历下一个
  36. else if(A[i] == 1)
  37. {
  38. ++i;
  39. }
  40. }
  41. return A;
  42. }


测试函数:

  1. int main(void)
  2. {
  3. int a[6] = {0,1,1,0,2,2};
  4. vector<int> v(a, a + 6);
  5. ThreeColor tc;
  6. v= tc.sortThreeColor(v, 6);
  7. for (int i = 0; i < 6; ++i)
  8. {
  9. cout<<v[i];
  10. }
  11. return 0;
  12. }


输出结果:
001122


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/空白诗007/article/detail/744980
推荐阅读
相关标签
  

闽ICP备14008679号