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

原创 2013年07月03日 12:27:40
/**
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;
}

面试编程题---其中隐藏着若干0,其余非0整数,使A把0移至后面,非0整数移至数组前面并保持有序

题目:int A[nSize],其中隐藏着若干0,其余非0整数,写一个函数int Func(int* A, int nSize),使A把0移至后面,非0整数移至数组前面并保持有序,返回值为原数据中第一...
  • coding__madman
  • coding__madman
  • 2016年07月06日 14:47
  • 966

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

int A[nSize],其中隐藏着若干0,其余非0整数,写一个函数int Func(int* A, int nSize),使A把0移至后面,非0整数移至 数组前面并保持有序,返回值为原数据中第一个...
  • unictimes
  • unictimes
  • 2015年07月17日 22:37
  • 718

将任意整数数组中的0都都放在数组最后

题目描述:从键盘任意输入一个整数数字,将此整数数组中所有包含的0都放在数组的最后,非0项顺序不变(Java实现) 算法描述:   1.首先要先找到此数组中的第一个为0项,并将此项下标值赋给k,再找到k...
  • gg543012991
  • gg543012991
  • 2016年03月27日 00:27
  • 1468

编写一个函数,从标准输入读取一列整数, 把这些值存储在一个动态分配的数组中并返回这个数组。 函数通过观察EOF判断输入列表是否结束。 数组的第一个数是数组包含的值的个数, 它的后面就是这些整数值。

/**************************************** * File Name : readints.c * Creat Data : 2015.1.22 * ...
  • qaz3171210
  • qaz3171210
  • 2015年01月22日 16:56
  • 950

返回一个数组中所有元素被第一个元素除的结果

这是朋友问的题,先贴出题中给的代码: void DivArray(int *pArray,int n) { int i; for (i = 0; i < n; i++) { pArray[...
  • cl_cjh
  • cl_cjh
  • 2016年12月18日 19:17
  • 732

Problem  M 在数组中查找指定元素 函数

题目描述 本题要求实现一个在数组中查找指定元素的简单函数。 函数接口定义: int search( int list[], int n, int x ); 其中list[]是用户传入的数组;n...
  • gtoo888
  • gtoo888
  • 2017年11月28日 09:24
  • 2143

5×5的二维数组,交换两行

数组 第8题 【描述】 编写一个函数:int swap(int array [5][5], int n, int m ),输入参数是5×5的二维数组,和n、m两个行下标。功能:判断n、m是否在数...
  • u011545923
  • u011545923
  • 2014年11月29日 12:33
  • 1860

两个有序数组合并成一个有序数组

思想:先依次比较两个数组,按照小的就传入新的数组。当这次比较完之后可能有一个数组的长度很长,留下一些数组,然后在新数组的末尾插入即可。 代码: public class ArraySort {...
  • paincupid
  • paincupid
  • 2015年08月19日 22:37
  • 3201

有序数组用二分法查询位置

面试中有个题是有序数组用二分法查询,哎,一看到是算法的题我当时就蒙圈了。真心的不晓得怎么做了。后来后查下百度其实没有我想的那么难,还是写下来是怎么回事吧,要不怕以后忘记了。 二分法查询其实就是在这个...
  • qazqaz12378
  • qazqaz12378
  • 2015年11月13日 16:01
  • 862

C#.NET:高级编程之系统内置委托(有Func/无返回值Action)

转载声明:转载本文是为了方便自己查看,有需要的朋友建议查看原文(注:原文中有作者纠正的评论,我没有搬运) 原文地址:http://www.cnblogs.com/akwwl/p/3232679.ht...
  • fromfire2
  • fromfire2
  • 2017年07月02日 17:20
  • 657
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:写一个函数int Func(int* A, int nSize), 使A把0移至后面,非0整数移至数组前面 并保持有序,返回值为原数据中第一个元素为0的下标。
举报原因:
原因补充:

(最多只允许输入30个字)