写一个函数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; }
相关文章推荐
- (2)int A[nSize],其中隐藏着若干0,其余非0整数,写一个函数int Func(int* A, int nSize),使A把0移至后面,非0整数移至数组前面并保持有序,返回值为原数据中第一个元素为0的下标。(尽可能不使用辅助空间且考虑效率及异常问题,注释规范且给出设计思路)
- 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整数移至数组前面并保持有序
- 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整数移至后面
- 面试编程题---其中隐藏着若干0,其余非0整数,使A把0移至后面,非0整数移至数组前面并保持有序
- 有一个整数数组,请编写一个函数,找出索引m和n,只要将m和n之间的元素排好序,整个数组就是有序的。注意:n-m应该越小越好,也就是说,找出符合条件的最短序列。 给定一个int数组A和数组的大小n,请
- 程序员面试金典——解题总结: 9.17中等难题 17.6给定一个整数数组,编写一个函数,找出索引m和n,只要将m和n之间的元素排好序,整个数组就是有序的。注意:n - m越小越好,也就是说,找出
- 二、 编写函数int stat(int a[],int n,int c[][2])。a指向的数组中保存了由n个1位整数组成的数列(n为偶数)。函数从前至后依次将a数组中每两个相邻元素拼成一个不超过2位
- 编写函数int stat(int a[],int n,int c[][2])。a指向的数组中保存了由n个1位整数组成的数列(n为偶数)。函数从前至后依次将a数组中每两个相邻元素拼成一个不超过2位的
- 编写一个函数,从标准输入读取一列整数, 把这些值存储在一个动态分配的数组中并返回这个数组。 函数通过观察EOF判断输入列表是否结束。 数组的第一个数是数组包含的值的个数, 它的后面就是这些整数值。
- 已知一个几乎有序的数组,几乎有序是指,如果把数组排好顺序的话,每个元素移动的距离可以不超过k,并且k相对于数组来说比较小。请选择一个合适的排序算法针对这个数据进行排序。 给定一个int数组A,同时给定
- 程序员面试题目总结--数组(五)【数组的后面m个数移动为前面m个数、列的前n项数据、判断整数x是否可以表示成n个连续正整数的和、数组中出现奇数次的元素、二维数组中的查找】
- 一个整数数组,用后面的元素减去前面的元素,求最大值。
- 上海华为的一道关于指针方面的编程题 int A[nSize],其中隐藏着若干0,其余非0整数,写一个函数int Func(int* A, int nSize)
- 编写一个函数,从标准输入读取一列整数,把这些值存储于一个动态分配的数组中并返回这个数组。函数通过观察EOF判断输入列表是否结束。数组的第一个数是数组包含的值的个数,他的后面就是这些整数值。
- 编写函数int stat(int a[],int n,int c[][2])。a指向的数组中保存了由n个1位整数组成的数列(n为偶数)。函数从前至后依次将a数组中每两个相邻元素拼成一个不超过2位的
- 编写函数int stat(int a[],int n,int c[][2])。a指向的数组中保存了由n个1位整数组成的数列(n为偶数)。函数从前至后依次将a数组中每两个相邻元素拼成一个不超过2位
- 给定一个整数数组,找出两个下标,要求后面下标所指的数减去前面下标所指的数之差最大
- 题目是:写一个函数,返回一个数组中所有元素被第一个元素除的结果