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,指针(普通指针),就是保存内存地址的值 ...
随机推荐
- 【HDOJ】2364 Escape
bfs.题目做的不细心,好多小错误.尤其注意起始点就是边界的情况.wa了八次. #include <iostream> #include <cstdio> #include & ...
- Integer Intervals(贪心)
Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 12123 Accepted: 5129 Description An i ...
- Sort List ——LeetCode
Sort a linked list in O(n log n) time using constant space complexity. 链表排序,要求时间复杂度O(nlgn),我写的归并排序. ...
- 301重定向与CNAME
CNAME记录是域名指向另一个域名A记录是域名指向IP地址URL跳转是打开这个网址的时候会跳转到另一个指定的网址,URL跳转分为301永久重定向和302临时重定向. 301永久重定向会使搜索引擎抓取新 ...
- Android注解利器:ButterKnife 的基本使用
前言 ButterKnife 简介 ButterKnife是一个专注于Android系统的View注入框架,可以减少大量的findViewById以及setOnClickListener代码,可视化一 ...
- Android RelativeLayout 布局android:layout_centerHorizontal="true"注意
特别注意,如果要是 android:layout_alignTop="@id/bind_decode_item_layout" android:layout_centerHoriz ...
- UILable:显示多种颜色的方法
借用别人封装好的类库,用来显示同一个UILable上的多种颜色的字. 类库可以直接在次博客中下载,下载后别忘留言哦. 类库使用:主要用了CoreText里面的东西,所以在使用类库之前需要引用CoreT ...
- 专业DBA 遇到的问题集
http://blog.csdn.net/mchdba/article/category/1596355/3
- rabbitmq Clustering Guide--官方
官方文档地址:http://www.rabbitmq.com/documentation.html A RabbitMQ broker is a logical grouping of one or ...
- JQ滑动导航菜单的实现
前言:不多说直接看效果!!! 这样的菜单我们在一般的网站上见到的也比较多,有比较好的用户体验! 原理:这个很重要,任何的特效只要原理搞明白了,实现起来都是很容易的!这个特效的原理很简单,菜单的样式 ...