将一个数组的非零元素移动到数组的前面,零元素置于数组的后面

来源:互联网 发布:秋天 连衣裙 搭配 知乎 编辑:程序博客网 时间:2024/05/21 09:22

  <span style="font-size:18px;">题目:将一个数组中的所有非零元素移动到数组的前面,零元素移动到数组的后面,同时返回新数组中第一个0元素 的下标,要求不能改变数组中非零元素的顺序。比如 :   arr[10] = {1,3,0,2,0,0,8,0,4};   移动之后为:  arr[] = {1,3,2,8,4,0,0,0,0}</span></p>方法一,利用两个循环,外层循环找到一个0元素,内层循环找到一个非0元素,然后交换位置,思路非常简单,但是代码写起来比较麻烦!!1 #include<iostream>  2 using namespace std;  3 int main()  4 {  5   int array[10] = {2,5,0,1,0,0,8,4};  6   int count = 0;  7   for(int i = 0;i < 10;i++)  8   {  9     // 通过从前往后的遍历找到一个0元素 10     if(array[i] == 0) 11     { 12       for(int j = i;j < 10; j++) 13       { 14         // 从前往后遍历找到一个非0元素,然后交换 15         if(array[j] != 0) 16         { 17           array[i] = array[j]; 18           array[j] = 0; 19           count++; 20           break; 21         } 22       } 23     } 24   } 25  26   //输出数组中的元素 27   for(int i = 0;i < 10;i++) 28   { 29     cout << array[i]; 30   } 31   cout << endl; 32   // 输出新数组中第一个0元素的下标 33   cout << count+1 << endl; 34   return 0; 35 }

方法二、类似于冒泡的算法,遇到一个0元素,则和后面的元素交换,这样一趟下来都会有一个0元素被放到最尾端,而一共需要10趟,当然了还有类似与插入排序的算法等,鉴于时间的关系,暂时不写了。
  1 #include<iostream>
  2 using namespace std;
  3 int main()
  4 {
  5   int array[10] = {1,0,4,2,0,0,8,5,0};
  6   for(int j = 0; j < 10;j++){
  7     for(int i = 0;i < 9; i++)
  8     {
  9       if(array[i] == 0)
 10       {
 11         int temp = array[i];
 12         array[i] = array[i+1];
 13         array[i+1] = temp;
 14       }
 15     }
 16   }
 17   for(int i = 0;i < 10;i++)
 18   {
 19     cout << array[i];
 20   }
 21   cout << endl;
 22 }
~         


0 0
原创粉丝点击