yutiannj的专栏

C/C++/JAVA/WEB/Android

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

/**
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[n]);
	}
	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[n]);
	}
	printf("\n");
	
	printf("res = %d \n",res);
	return 0;
}

阅读更多
文章标签: c
个人分类: C/C++
上一篇二叉树_自己写的,不是很好,但基本功能都实现了
下一篇程序员面试宝典13.1的单链表所有程序,包括注释理解
想对作者说点什么? 我来说一句

华为笔试面试题集(C/C++)

2008年12月14日 294KB 下载

没有更多推荐了,返回首页

关闭
关闭