C语言零移位操作
给定一个整形数组要求把其中的零元素移动到数组的末尾 非零元顺序保持不变
以下采用两种方法实现
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <windows.h> void PrintArr( int arr[], int iSize )
{
if( iSize < 0 )
return; int i = 0;
for( ; i < iSize; i++ )
{
if( !arr[i] )
printf( "%d ", arr[i] );
} puts( "" );
} void LocalMove( int arr[], int iSize )
{//本地移动 速度极慢 优点是消耗内存空间少
if( iSize <= 1 )
return; int i,j; int iZeroCount = 0;//零元总数 for( i = 0; i < iSize; i++ )
{
if( !arr[i] )
iZeroCount++;
} int iZeroCur = iZeroCount; for( i = 0; i < iSize && iZeroCur > 0; i++ )
{
if( !arr[i] )
{
for( j = i; j < iSize - ( iZeroCount - iZeroCur ); j++ )
{
arr[j] = arr[j+1];
} arr[j-1] = 0;
iZeroCur--;
i--;
}
} //PrintArr( arr, iSize );
} int* CreateIntArr( int iSize )
{//创建整形数组
puts( "CreateArr" ); int* pIntArr = (int*)malloc( sizeof( int ) * iSize ); if( !pIntArr )
return NULL; srand( iSize ); int i = 0;
for( ; i < iSize; i++ )
{
if( 0 == i % 2 )
*( pIntArr + i ) = rand();
else
*( pIntArr + i ) = 0;
} puts( "Finish create array!" ); return pIntArr;
} int* CopyArr( int* pArrInt, int iSize )
{//复制整形数组
if( !pArrInt || iSize <= 0 )
return NULL; int* pNewArr = (int*)malloc( sizeof( int ) * iSize ); if( !pNewArr )
return NULL; puts( "Starting copy array ..." );
int i = 0;
for( ; i < iSize; i++ )
{
*( pNewArr + i ) = *( pArrInt + i );
} puts( "Finish copy array..." ); return pNewArr;
}
void SaveMove( int arr[], int iSize )
{//空间换时间 这个算法的速度是上个算法速度的8万倍以上 这个专卖值得做
if( iSize <= 1 )
return; int i = 0;
int iNoneZero = 0; for( ; i < iSize; i++ )
{
if( arr[i] )
iNoneZero++;
} int* pIntArr = (int*)malloc( sizeof( int ) * iNoneZero );
int iCur = 0;
for( i = 0; i < iSize && iNoneZero > 0; i++ )
{
if( arr[i] )
{
*(pIntArr + iCur++) = arr[i];
iNoneZero--;
}
} memset( arr, 0, iSize );
for( i = 0; i < iCur; i++ )
{
arr[i] = *( pIntArr + i );
} //PrintArr( arr, iSize );
} int main( int argc, char* argv[] )
{
if( argc < 2 )
{
puts( "Usage: MoveZero.exe number" );
return -1;
} int iNum = atoi( argv[1] ); if( iNum <= 0 )
{
puts( "Error argument!" );
} int* pIntArrOne = CreateIntArr( iNum );
int* pIntArrTwo = CopyArr( pIntArrOne, iNum ); long lStart; lStart = GetTickCount();
puts( "LocalMove" );
LocalMove( pIntArrOne, iNum );
printf( "LocalMove Cost Time: %ld\n", GetTickCount() - lStart ); lStart = GetTickCount();
puts( "SaveMove" );
SaveMove( pIntArrTwo, iNum );
printf( "SaveMove Cost Time: %ld\n", GetTickCount() - lStart ); return 0;
}
测试结果如下:
C:\Users\fzql>"F:\MyDocument\Visual Studio 2008\Projects\VCInterview\VCInterview
\Debug\VCInterview.exe" 102400
CreateArr
Finish create array!
Starting copy array ...
Finish copy array...
LocalMove
LocalMove Cost Time: 16208
SaveMove
SaveMove Cost Time: 0
C:\Users\fzql>"F:\MyDocument\Visual Studio 2008\Projects\VCInterview\VCInterview
\Debug\VCInterview.exe" 1024000
CreateArr
Finish create array!
Starting copy array ...
Finish copy array...
LocalMove
LocalMove Cost Time: 1377832
SaveMove
SaveMove Cost Time: 16
C语言零移位操作的更多相关文章
- [易学易懂系列|rustlang语言|零基础|快速入门|(28)|实战5:实现BTC价格转换工具]
[易学易懂系列|rustlang语言|零基础|快速入门|(28)|实战5:实现BTC价格转换工具] 项目实战 实战5:实现BTC价格转换工具 今天我们来开发一个简单的BTC实时价格转换工具. 我们首先 ...
- [易学易懂系列|rustlang语言|零基础|快速入门|(27)|实战4:从零实现BTC区块链]
[易学易懂系列|rustlang语言|零基础|快速入门|(27)|实战4:从零实现BTC区块链] 项目实战 实战4:从零实现BTC区块链 我们今天来开发我们的BTC区块链系统. 简单来说,从数据结构的 ...
- [易学易懂系列|rustlang语言|零基础|快速入门|(26)|实战3:Http服务器(多线程版本)]
[易学易懂系列|rustlang语言|零基础|快速入门|(26)|实战3:Http服务器(多线程版本)] 项目实战 实战3:Http服务器 我们今天来进一步开发我们的Http服务器,用多线程实现. 我 ...
- [易学易懂系列|rustlang语言|零基础|快速入门|(25)|实战2:命令行工具minigrep(2)]
[易学易懂系列|rustlang语言|零基础|快速入门|(25)|实战2:命令行工具minigrep(2)] 项目实战 实战2:命令行工具minigrep 我们继续开发我们的minigrep. 我们现 ...
- [易学易懂系列|rustlang语言|零基础|快速入门|(24)|实战2:命令行工具minigrep(1)]
[易学易懂系列|rustlang语言|零基础|快速入门|(24)|实战2:命令行工具minigrep(1)] 项目实战 实战2:命令行工具minigrep 有了昨天的基础,我们今天来开始另一个稍微有点 ...
- [易学易懂系列|rustlang语言|零基础|快速入门|(23)|实战1:猜数字游戏]
[易学易懂系列|rustlang语言|零基础|快速入门|(23)|实战1:猜数字游戏] 项目实战 实战1:猜数字游戏 我们今天来来开始简单的项目实战. 第一个简单项目是猜数字游戏. 简单来说,系统给了 ...
- [易学易懂系列|rustlang语言|零基础|快速入门|(5)|生命周期Lifetime]
[易学易懂系列|rustlang语言|零基础|快速入门|(5)] Lifetimes 我们继续谈谈生命周期(lifttime),我们还是拿代码来说话: fn main() { let mut a = ...
- [易学易懂系列|rustlang语言|零基础|快速入门|(22)|宏Macro]
[易学易懂系列|rustlang语言|零基础|快速入门|(22)|宏Macro] 实用知识 宏Macro 我们今天来讲讲Rust中强大的宏Macro. Rust的宏macro是实现元编程的强大工具. ...
- [易学易懂系列|rustlang语言|零基础|快速入门|(21)|智能指针]
[易学易懂系列|rustlang语言|零基础|快速入门|(21)|智能指针] 实用知识 智能指针 我们今天来讲讲Rust中的智能指针. 什么是指针? 在Rust,指针(普通指针),就是保存内存地址的值 ...
随机推荐
- latch介绍
latch是一种锁,用来实现对Oracle所有共享数据结构的串行化访问.共享池就是这样一个例子, 这是系统全局区中一个庞大的共享数据结构,Oracle正是在这里存储已解析,已编译的SQL. 修改这个共 ...
- 【HDOJ】5179 beautiful number
DFS. /* 5179 */ #include <iostream> #include <algorithm> #include <map> #include & ...
- C++中自己理解的一些细节哈
对于大牛来说,我写的可能很低级哈,留给自己看,以后遇到的都慢慢补充哈!^^ 1.每一个类定义结束后,不要忘了在类的结束符"}"后面加上一个";"哦! 2.构造函 ...
- POJ Countries in War 3114
题目大意: 给定一些城市,然后再给一些寄信的路信,A,B,H代表把信从A城市寄到B城市需要H小时. 如果没有直接可以寄达的,可以先通过另外一个城市到达,比如A,B可以寄信,B,C可以寄信,那么,A,C ...
- Linux 多线程调试(内存占用、死循环、CPU占用率高……)
文章出处:http://www.cnblogs.com/cy568searchx/archive/2013/10/28/3391790.html 你的软件在某个时刻停止服务,CPU占用达到100%+, ...
- Period - HDU 1358(next求循环节)
题目大意:有一个长N的字符串,如果前缀Ni是一个完全循环的串(循环次数大于1),输出Ni和它循环了多少次. 分析:输入next的应用,求出来next数组直接判断Ni是否是完全的循环就行了,也就是N ...
- React Native专题
转载注明出处:地址:http://www.lcode.org本文出自:[江清清的技术专栏]本React Native讲解专题:主要讲解了React Native开发,由基础环境搭建配置入门,基础,进阶 ...
- Linux一键安装PHP/JAVA环境OneinStack
OneinStack 是一款PHP/JAVA环境一键配置工具. OneinStack包含以下组合 lnmp(Linux + Nginx+ MySQL ...
- Linux Shell编程学习笔记
打算在学习过程中将每个写过的程序一个个的往上贴; 2015-07-03 1. 鸟叔第三版13.2.1节“利用日期进行文件的创建” 源代码 #!/bin/bashPATH=/bin:/sbin:/usr ...
- Demo_CS(移动,切换枪支,发射子弹)
using UnityEngine; using System.Collections; public class Gun : MonoBehaviour { private Animator ani ...