解:
思路1:不知道这里的有序是什么个意思。是按照大小有序,还是按原来先后顺序有序。如果是原来先后顺序有序的话。只需要一次遍历,将为0的元素填充为后面第一个不为0 的元素,然后将不为0的元素置0即可。
- int Func(int *a, int nSize){
- assert(a != Null && nSize > 0);
- int index;
- int i, j;
- i = 0;
- j = 0;
- while (i < nSize && a[i] != 0 ) ++i;
- if ( i >= nSize)
- return -1;//没有0
- else{
- index = i;
- j = i + 1;
- }
- while(i < nSize && j < nSize){
- // 寻找0元素
- while (i < nSize && a[i] != 0 ) ++i;
- // 找i位置后第一个不是0的元素
- while (j < nSize && a[j] == 0 ) ++j;
- if (i < nSize && j < nSize){
- a[i++] = a[j];
- a[j++] = 0;
- }
- }
- return index;
- }
思路2:借用快速排序思想,设两指针low和high,分别指向数组头和尾。low指针从前往后扫描为0的元素,high指针从后往前扫描不为0的元素然后交换,当low<high时结束,此时high指针指向不为0元素中的最后一个。然后对a[0..high]进行从大到小排序。
- int Func(int *a, int nSize){
- // 将零元素移到数组尾部
- int low = 0;
- int high = nSize - 1;
- int firstIndex;
- bool isFirst = true;
- while (low <= high){
- while (low <= high && a[high] == 0)
- --high;
- while (low <= high && a[low] != 0)
- ++low;
- if (isFirst) { firstIndex = low; isFirst = false; }
- if (low <= high){ a[low] = a[high]; a[high] = 0; }
- }
- // 将前面的非零元素排序
- int dk = nSize / 2;
- int t;
- while(dk >= 1){
- for (int i = dk; i <= high; ++i){
- if (a[i] < a[i-dk]){
- t = a[i];
- for (int j = i - dk; j >=0 && t < a[j]; j -= dk)
- a[j+dk] = a[j];
- a[j+dk] = t;
- }//if
- }//for
- dk /= 2;
- }//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;
}