zoukankan      html  css  js  c++  java
  • 排序算法01-直接插入排序(用C++、C#、lua实现)





    本文为排序算法-直接插入排序的代码实现。
    作者水平比较差,有错误的地方请见谅。

    1、直接插入排序

    冒泡排序属于插入排序。

    排序最好情况:为正序,需进行 n-1 趟排序,进行 n-1 次比较和0次移动数据。
    排序最坏情况:为逆序,需进行 n-1 趟排序,进行 n^2/2 次比较和 n^2/2 次移动数据。

    平均比较次数:n^2/4
    平均移动次数:n^2/4

    平均时间复杂度:O(n^2)
    平局空间复杂度:O(1)。因为只在交换位置时使用一个辅助空间做暂存记录。

    2、C#实现

    StraightInsert.cs

    	public static class StraightInsertSort
        {
            public static void StraightInsert(int[] numbers)
            {
                if (numbers == null || numbers.Length < 2)
                {
                    Console.WriteLine("参数数组有误");
                    return;
                }
    
                int temp;
                for (int i = 1; i < numbers.Length; i++)
                {
                    //判断新加入的元素不是最大的
                    if (numbers[i] < numbers[i - 1])
                    {
                        temp = numbers[i];
                        //把大于新元素的元素向前移动
                        int j;
                        //注意要先判断j>0,不然当j=0时判断numbers[j-1]会出现越界数组
                        //我就被这个坑了好一会儿
                        for (j = i; j > 0 && numbers[j-1] > temp ; j--)
                        {
                            numbers[j] = numbers[j-1];
                        }
                        //把新元素插入到应有的位置
                        numbers[j ] = temp;
                    }
    
                    for (int k = 0; k < numbers.Length; k++)
                    {
                        Console.Write(numbers[k] + " ");
                    }
                    Console.WriteLine();
                }
            }
        }
    

    Program.cs

    	class Program
        {
            static void Main(string[] args)
            {
                int[] numbers = { 49, 38, 65, 97, 76, 13, 27, 49 };
                numbers = StraightInsertSort.StraightInsert(numbers);
    
                for (int i = 0; i < numbers.Length; i++)
                {
                    Console.Write(numbers[i] + " ");
                }
                Console.WriteLine();
    
                Console.ReadKey();
            }
        }
    

    3、C++实现

    StraightInsertSort.cpp

    ///直接插入排序
    class StraightInsertSort
    {
    public:
        static void StraightInsert(int numbers[],int length);
    };
    
    void StraightInsertSort::StraightInsert(int numbers[],int length)
    {
        if (numbers == NULL || length < 2)
        {
            cout<<"参数数组有误"<<endl;
            return;
        }
    
        int temp;
        for (int i = 1; i < length; i++)
        {
            //判断新加入的元素不是最大的
            if (numbers[i] < numbers[i - 1])
            {
                temp = numbers[i];
                //把大于新元素的元素向前移动
                int j;
                //注意要先判断j>0,不然当j=0时判断numbers[j-1]会出现越界数组
                //我就被这个坑了好一会儿
                for (j = i; j > 0 && numbers[j-1] > temp ; j--)
                {
                    numbers[j] = numbers[j-1];
                }
                //把新元素插入到应有的位置
                numbers[j] = temp;
            }
    
    
            for (int k = 0; k < length; k++)
            {
                cout << numbers[k] << " ";
            }
            cout << endl;
        }
    }
    

    main.cpp

    int main()
    {
        int numbers[] = {49,38,65,97,76,13,27,49};
        int length = sizeof(numbers)/sizeof(numbers[0]);
    
        StraightInsertSort::StraightInsert(numbers,length);
    
        for(int i=0;i<length;i++){
            cout<<numbers[i]<<" ";
        }
        cout<<endl;
    
        return 0;
    }
    

    4、lua实现

    numbers = {49,38,65,97,76,13,27,49}
    
    function BubbleSort(nums)
    	local length = #nums
    	if (nums == nil or length < 2) then
    		print("参数数组有误")
    		return
    	end
    
    	for i=2,length,1 do
    
    		if(nums[i] < nums[i-1]) then
    			local temp = nums[i]
    
    			for j=i,1,-1 do
    				if(j>1 and nums[j-1]>temp) then
    					nums[j] = nums[j-1]
    				else
    					nums[j] = temp
    					break
    				end
    			end
    		end
    
    		for k=1,length,1 do
    			io.write(nums[k] .. ' ')
    		end
    		print()
    	end
    end
    
    BubbleSort(numbers)
    
    for i=1,#numbers,1 do
    	io.write(numbers[i] .. ' ')
    end
    print()
    
    --#nums  获取数组长度
    
    

    5、新知识和疑问

  • 相关阅读:
    Recommended Books for Algo Trading in 2020
    Market Making is simpler than you think!
    Top Crypto Market Makers of 2020
    Top Crypto Market Makers, Rated and Reviewed
    爬取伯乐在线文章(五)itemloader
    爬取伯乐在线文章(四)将爬取结果保存到MySQL
    爬取伯乐在线文章(三)爬取所有页面的文章
    爬取伯乐在线文章(二)通过xpath提取源文件中需要的内容
    爬取伯乐在线文章(一)
    爬虫去重策略
  • 原文地址:https://www.cnblogs.com/Fflyqaq/p/11818306.html
Copyright © 2011-2022 走看看