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

算法在计算机科学领域中占有举足轻重的地位,一套算法设计的好坏直接决定了一项工程的成败。在大学教育中老师就教导我们要数据结构 + 算法(现在还需要加上体系结构吧),但是这两门基础课我却从没有学好过:)我打算来个周记,每周仔细研究一个算法,然后分别用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#语言描述:

代码
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[] { 14265 });
            
foreach (int i in arr)
            {
                Console.Write(i 
+ ",");
            }
            Console.ReadLine();
        }
    }
}

 

Java语言描述:

代码
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[] { 14265 });

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

 

Matlab语言描述:

代码
% 定义数组
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);
posted @ 2010-03-14 15:56  江苏瑞步科技  阅读(966)  评论(0编辑  收藏  举报