int A[nSize],其中隐藏着若干0,其余非0整数,写一个函数int Func(int* A, int nSize),使A把0移至后面,非0整数移至数组前面并保持有序

来源:互联网 发布:腾讯视频 for mac 编辑:程序博客网 时间:2024/05/22 11:51

解:

思路1:不知道这里的有序是什么个意思。是按照大小有序,还是按原来先后顺序有序。如果是原来先后顺序有序的话。只需要一次遍历,将为0的元素填充为后面第一个不为0 的元素,然后将不为0的元素置0即可。

[cpp] view plaincopy
  1. int Func(int *a, int nSize){  
  2.     assert(a != Null && nSize > 0);  
  3.     int index;  
  4.     int i, j;  
  5.     i = 0;  
  6.     j = 0;  
  7.     while (i < nSize && a[i] != 0 ) ++i;  
  8.     if ( i >= nSize)  
  9.         return -1;//没有0  
  10.     else{  
  11.         index = i;  
  12.         j = i + 1;  
  13.     }  
  14.     while(i < nSize && j < nSize){  
  15.     // 寻找0元素   
  16.         while (i < nSize && a[i] != 0 ) ++i;  
  17.     // 找i位置后第一个不是0的元素   
  18.         while (j < nSize && a[j] == 0 ) ++j;  
  19.         if (i < nSize && j < nSize){  
  20.             a[i++] = a[j];  
  21.             a[j++] = 0;  
  22.         }  
  23.     }  
  24.     return index;  
  25. }  
 

思路2:借用快速排序思想,设两指针low和high,分别指向数组头和尾。low指针从前往后扫描为0的元素,high指针从后往前扫描不为0的元素然后交换,当low<high时结束,此时high指针指向不为0元素中的最后一个。然后对a[0..high]进行从大到小排序。

[cpp] view plaincopy
  1. int Func(int *a, int nSize){  
  2.     // 将零元素移到数组尾部   
  3.     int low = 0;  
  4.     int high = nSize - 1;  
  5.     int firstIndex;  
  6.     bool isFirst = true;  
  7.     while (low <= high){  
  8.         while (low <= high && a[high] == 0)  
  9.             --high;  
  10.         while (low <= high && a[low] != 0)  
  11.             ++low;  
  12.         if (isFirst) { firstIndex = low; isFirst = false; }  
  13.         if (low <= high){ a[low] = a[high]; a[high] = 0; }  
  14.     }  
  15.     // 将前面的非零元素排序   
  16.     int dk = nSize / 2;  
  17.     int t;  
  18.     while(dk >= 1){  
  19.         for (int i = dk; i <= high; ++i){  
  20.             if (a[i] < a[i-dk]){  
  21.                 t = a[i];  
  22.                 for (int j = i - dk; j >=0 && t < a[j]; j -= dk)  
  23.                     a[j+dk] = a[j];  
  24.                 a[j+dk] = t;  
  25.             }//if  
  26.         }//for  
  27.         dk /= 2;  
  28.     }//wh

思路三:

#include "iostream"using namespace std;int func(int* A,int sizeN){for(int i=0;i<sizeN;i++){while (*(A+i)!=0){i++;}int j=i;while ((j<sizeN)&&(*(A+j)==0)){j++;}if((j>i)&&(i<sizeN)&&(j<sizeN)){swap(*(A+i),*(A+j));}}return 0;}int main(){int DATA[16] = {0,1,0,0,3,4,5,0,0,0,0,10,99,32754,0,0};  func(DATA,16);for(int i=0;i<16;i++)cout<<DATA[i]<<endl;return 0;}


原创粉丝点击