2、【常见算法】按序重排问题

给定含有n个元素的整型数组a,其中包括0元素和非0元素,对数组进行排序,要求:
  1、排序后所有0元素在前,所有非零元素在后,且非零元素排序前后相对位置不变
  2、不能使用额外存储空间
例子如下
输入 0、3、0、2、1、0、0
输出 0、0、0、0、3、2、1
分析

  此排序非传统意义上的排序,因为它要求排序前后非0元素的相对位置不变,或许叫做整理会更恰当一些。我们可以从后向前遍历整个数组,遇到某个位置i上的元素是非0元素时,如果arr[k]为0,则将arr[i]赋值给arr[k],arr[i]赋值为0。实际上i是非0元素的下标,而k是0元素的下标。

 1 /*
 2 给定含有n个元素的整型数组a,其中包括0元素和非0元素,对数组进行排序,要求:
 3 1、排序后所有0元素在前,所有非零元素在后,且非零元素排序前后相对位置不变
 4 2、不能使用额外存储空间
 5 例子如下
 6 输入 0、3、0、2、1、0、0
 7 输出 0、0、0、0、3、2、1
 8 
 9 */
10 #include <iostream>
11 
12 using namespace std;
13 
14 void sortArray(int *arr, int n)
15 {
16     int i, k = n-1;
17 
18     for(i = n-1; i >= 0; i--)
19     {
20         if(arr[i] != 0)
21         {
22             if(arr[k] == 0)
23             {
24                 arr[k] = arr[i];
25                 arr[i] = 0;
26             }
27             k--;
28         }
29     }
30 }
31 
32 int main()
33 {
34     int arr[7] = {0, 3, 0, 1, 0, 0, 2};
35     sortArray(arr, 7);
36     for(int i = 0; i < 7; i++)
37     {
38         cout << arr[i] << "	";
39     }
40     cout << endl;
41     return 0;
42 }
原文地址:https://www.cnblogs.com/Long-w/p/9791935.html