算法周记(一)直接插入排序

算法在计算机科学领域中占有举足轻重的地位,一套算法设计的好坏直接决定了一项工程的成败。在大学教育中老师就教导我们要数据结构 + 算法(现在还需要加上体系结构吧),但是这两门基础课我却从没有学好过:)我打算来个周记,每周仔细研究一个算法,然后分别用C#、Java、Matlab实现,供感兴趣的朋友一起学习、研究。除了常见的算法分类之外,我会格外关注数值算法,因为我对数学有着浓厚的兴趣。由于我C++学的不好,故不提供C++算法实现,具体C++的资料很多,感兴趣的朋友可以多查找下。

示例代码下载

测试环境:

Windows Server 2008 R2 DataCenter

C#:Visual Studio 2010 Ultimate RC(.NET Framework 4.0 RC x64)

Java:Eclipse SDK 3.5.1 x64(JDK 1.6 Update 18 x64)

Matlab:Matlab R2009b x64

PS(Visual Studio 2010正式版即将发布,到时会更新;Matlab R2010a已经发布,正在测试,近期也会更新)

 

直接插入排序

基本思想:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的记录中的适当位置,直到全部记录插入完成为止。

直接插入排序是把一个序列分为两部分,第一部分是排好序的,数学上叫做"有序区",然后从第二个部分中("无序区")将第一个记录插入到有序区中,使得插入后有序区仍然有序。然后重复上述操作,每次无序区均减少一个记录,直至其中记录数为零。

复杂度:时间复杂度为O(N^2),空间复杂度为O(1)。

可以看出,N^2还是很大的,当N较大时,不宜采用直接插入排序。推荐记录的数目是N<20。

 

C#语言描述:

ExpandedBlockStart.gif 代码
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Text;

namespace  InsertSort
{
    
class  InsertSortDemo
    {
        
private   static   int [] fxInsertSort( int [] arr)
        {
            
int  i, j, arrTmp;
            
for  (i  =   1 ; i  <  arr.Length; i ++ )
            {
                j 
=  i;
                arrTmp 
=  arr[i];
                
while  (j  >   0   &&  arr[j  -   1 >  arrTmp)
                {
                    arr[j] 
=  arr[j  -   1 ];
                    j
-- ;
                }
                arr[j] 
=  arrTmp;
            }
            
return  arr;
        }

        
static   void  Main( string [] args)
        {
            
int [] arr  =  InsertSortDemo.fxInsertSort( new   int [] {  1 4 2 6 5  });
            
foreach  ( int  i  in  arr)
            {
                Console.Write(i 
+   " , " );
            }
            Console.ReadLine();
        }
    }
}

 

Java语言描述:

ExpandedBlockStart.gif 代码
package  brooks.cnblogs.arithmetic.sort;

public   class  InsertSortDemo {

    
/**
     * 
@param  args
     
*/
    
private   static   int [] fxInsertSort( int [] arr) {
        
int  i, j, arrTmp;
        
for  (i  =   1 ; i  <  arr.length; i ++ ) {
            j 
=  i;
            arrTmp 
=  arr[i];
            
while  (j  >   0   &&  arr[j  -   1 >  arrTmp) {
                arr[j] 
=  arr[j  -   1 ];
                j
-- ;
            }
            arr[j] 
=  arrTmp;
        }
        
return  arr;
    }

    
public   static   void  main(String[] args) {
        
//  TODO Auto-generated method stub
         int [] arr  =  InsertSortDemo.fxInsertSort( new   int [] {  1 4 2 6 5  });

        
for  ( int  i  =   0 ; i  <  arr.length; i ++ ) {
            System.out.print(arr[i] 
+   " , " );
        }
    }
}

 

Matlab语言描述:

ExpandedBlockStart.gif 代码
% 定义数组
arr 
=  [ 1   4   2   6   5 ] ;
% Matlab中数组索引从1开始
for  i  =   2 :length ( arr )
    j 
=  i ;
    arrTmp 
=  arr ( i );
    while j 
>   1  &&  ( arr ( j -  1 )   >  arrTmp )
        arr
( j )   =  arr ( j -  1 );
        j 
=  j -  1 ;
    
end
    arr
( j )   =  arrTmp ;
end
% 输出排序后结果
disp
( arr );

转载于:https://www.cnblogs.com/brooks-dotnet/archive/2010/03/14/1685581.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值