排序算法之0-1、0-1-2排序

之前碰到个非常有意思的题目,是关于排序算法的题目:

已知:一个数组:array,数组元素:0或1或2

求解:将数组按照0-1-2排序?

  1 template <class T>
  2 void Swap(T& t1, T& t2)
  3 {
  4     T tmp = t1;
  5     t1 = t2;
  6     t2 = tmp;
  7 }
  8 
  9 // Sorting a array which the elements are 0 or 1.
 10 void SortArray_0_1(int* arr, int n)
 11 {
 12     int first = 0;      // point to 0.
 13     int last = n - 1;   // point to 1.
 14 
 15     while (first < last)
 16     {
 17         // Find the position of first 0.
 18         while (0 == arr[first])
 19         {
 20             first++;
 21         }
 22 
 23         // Find the position of first 1.
 24         while (1 == arr[last])
 25         {
 26             last--;
 27         }
 28 
 29         if (first <= last && 1 == arr[first] && 0 == arr[last])
 30         {
 31             Swap(arr[first], arr[last]);
 32             first++;
 33             last--;
 34         }
 35     }
 36 }
 37 
 38 // Sorting a array which the elements are 0 or 1.
 39 void SortArray2_0_1(int* arr, int n)
 40 {
 41     //int first = 0;      // point to 0.
 42     int last = n - 1;   // point to 2.
 43     int k = 0;          // point to 1.
 44 
 45     while (k < last)
 46     {
 47         // Find 0.
 48         if (1 == arr[k])
 49         {
 50             while (1 == arr[last] && k < last)
 51             {
 52                 last--;
 53             }
 54 
 55             if (k < last)
 56             {
 57                 Swap(arr[k], arr[last]);
 58             }
 59         }
 60 
 61         if (0 == arr[k])
 62         {
 63             k++;
 64         }
 65     }
 66 }
 67 
 68 // Sorting a array which the elements are 0 or 1 or 2.
 69 void SortArry_0_1_2(int* arr, int n)
 70 {
 71     int first = 0;      // point to 0.
 72     int last = n - 1;   // point to 2.
 73     int k = 0;          // point to 1.
 74 
 75     while (k < last)
 76     {
 77         // Find 0.
 78         if (0 == arr[k])
 79         {
 80             while (0 == arr[first] && first < k)
 81             {
 82                 first++;
 83             }
 84 
 85             if (first < k)
 86             {
 87                 Swap(arr[k], arr[first]);
 88             }
 89         }
 90 
 91         // Find 1.
 92         if (1 == arr[k] || k == first)
 93         {
 94             k++;
 95         }
 96 
 97         // Find 2.
 98         if (2 == arr[k])
 99         {
100             while (2 == arr[last] && k < last)
101             {
102                 last--;
103             }
104 
105             if (k < last)
106             {
107                 Swap(arr[k], arr[last]);
108             }
109         }
110     }
111 }
原文地址:https://www.cnblogs.com/nchxmoon/p/4433046.html