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

来源:互联网 发布:手机暗黑类游戏 知乎 编辑:程序博客网 时间:2024/05/29 17:23
/**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<=endfor(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 randomint 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所指元素小于splitA[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;}

原创粉丝点击