写一个函数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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值