给定含有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 }