您的位置:首页 > 其它

写一个函数int Func(int* A, int nSize), 使A把0移至后面,非0整数移至数组前面 并保持有序,返回值为原数据中第一个元素为0的下标。

2013-07-03 12:27 573 查看
/**
int A[nSize],其中隐藏着若干0,其余非0整数,
写一个函数int Func(int* A, int nSize),
使A把0移至后面,非0整数移至数组前面
并保持有序,返回值为原数据中第一个元素为0的
下标。(尽可能不使用辅助空间且考虑效率
及异常问题,注释规范且给出设计思路)
*/
//设计思路:首先,将0元素置后;然后对非0元素快速排序

#include "stdio.h"
#include "stdlib.h"
#include "assert.h"

//将0元素放置于数组尾部
int end_zeros( int* A, int nSize ){
assert(A != NULL);
int end = nSize-1;
//不能i<=end
for(int i=0; i<end; i++){
if(A[i]==0){
//找到尾部不为0的元素位置
while(A[end]==0) end--;
//将0元素放置于数组尾部
int t = A[end];
A[end] = A[i];
A[i] = t;
}
}
return end;//返回值为原数据中第一个元素为0的下标
}

/**
*
* 快速排序
* 两向
*/
int Funk(int* A, int nSize){
assert(A != NULL);
if(nSize<2) return 0;
int split = A[0];//best random

int i=1;
int j=nSize-1;
//需要取等号---{10 9},A[0]=10,i指9,j也指9,i=j=1       A[0]和A[i-1]交换,必须执行一次i++
while(i<=j){
//从左往右找到大于split的元素
while(A[i]<=split) i++;
//从右往左找到小于split的元素
while(A[j]>split) j--;
if(i<j){
//大的放右边,小的不变

int t = A[i];
A[i] = A[j];
A[j] = t;

i++;
j--;
}

}
int t = A[i-1];//此时i所指元素大于split,而i-1所指元素小于split
A[i-1] = A[0];//有序
A[0] = t;

for(int n=0; n<nSize; n++){
printf("%d ",A
);
}
printf("\n");

Funk(A, i-1);//0:(i-2)
Funk(A+i, nSize-i);//i:(nSize-1)

return 0;

}

int Func(int* A, int nSize){
//将0元素放置于数组尾部
int res = end_zeros( A, nSize );
//非0元素进行排序
Funk(A, res);
return res;//返回值为原数据中第一个元素为0的下标
}

int main(){
int A[10]={2,0,6,0,7,8,1,9,10,0};
int res = Func(A, 10);

for(int n=0; n<10; n++){
printf("%d ",A
);
}
printf("\n");

printf("res = %d \n",res);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c
相关文章推荐