• 排序算法02-希尔排序(用C++、C#、lua实现)






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

    1、希尔排序

    希尔排序属于插入排序。

    平均时间复杂度:比直接插入低。具体分体非常复杂,有兴趣可自行研究。
    平局空间复杂度:O(1)。因为只在交换位置时使用一个辅助空间做暂存记录。

    2、C#实现

    ShellSort.cs

    	public static class ShellSort
        {
            public static void Shell(int[] numbers)
            {
                if (numbers == null || numbers.Length < 2)
                {
                    Console.WriteLine("参数数组有误");
                    return;
                }
    
                //存储每次的增量值
                int[] addArray = { 5, 3, 1 };
    
                for (int i = 0; i < addArray.Length; i++)
                {
                    //使用不同增量进行排序
                    ShellInsert(numbers, addArray[i]);
                }
    
    
            }
    
            public static void ShellInsert(int[] numbers, int add)
            {
                for (int i = add; i < numbers.Length; i++)
                {
                    //这里相当于直接插入排序,每次比较新加入的元素
                    //每个组的元素上一个元素index就是 -add
                    if (numbers[i] < numbers[i - add])
                    {
                        int temp = numbers[i];
                        int j;
                        //要保证数组不会越界
                        for (j = i; j > (i-add) && numbers[j - add] > temp; j -= add)
                        {
                            numbers[j] = numbers[j - add];
                        }
                        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 };
                ShellSort.Shell(numbers);
    
                for (int i = 0; i < numbers.Length; i++)
                {
                    Console.Write(numbers[i] + " ");
                }
                Console.WriteLine();
    
                Console.ReadKey();
            }
        }
    

    3、C++实现

    ShellSort.cpp

    ///希尔排序
    class ShellSort
    {
    public:
        static void Shell(int numbers[],int length);
        static void ShellInsert(int numbers[],int length,int add);
    };
    
    void ShellSort::Shell(int numbers[],int length)
    {
        if (numbers == NULL || length < 2)
        {
            cout<<"参数数组有误"<<endl;
            return;
        }
    
        int addArray[] = {5,3,1};
    
        for(int i=0;i<3;i++){
            ShellInsert(numbers,length,addArray[i]);
        }
    }
    void ShellSort::ShellInsert(int numbers[],int length,int add)
    {
        for(int i=add;i<length;i++){
    
            if(numbers[i]<numbers[i-add]){
                int temp = numbers[i];
                int j;
                for(j=i;j>(i-add)&&numbers[j-add]>temp;j-=add){
                    numbers[j] = numbers[j-add];
                }
                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]);
    
        ShellSort::Shell(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 ShellSort(nums)
    	local length = #nums
    	if (nums == nil or length < 2) then
    		print("参数数组有误")
    		return
    	end
    
    	local addArray = { 5, 3, 1 }
    
    	for i=1,#addArray,1 do
    		ShellInsert(nums, addArray[i])
    	end
    
    end
    
    function ShellInsert(nums,add)
    	for i=add+1,#nums,1 do
    
    		if (nums[i] < nums[i-add]) then
    
    			local temp = nums[i]
    			--这里相当于直接插入排序,每次比较新加入的元素
    			--每个组的元素上一个元素index就是 -add
    			for j=i,i-add,-add do
    				--要保证数组不会越界
    				if(j>i-add and nums[j-add]>temp) then
    					nums[j] = nums[j-add]
    				else
    					nums[j] = temp
    					break
    				end
    			end
    		end
    	end
    
    	for k=1,#nums,1 do
    		io.write(nums[k] .. ' ')
    	end
    	print()
    end
    
    
    
    ShellSort(numbers)
    
    for i=1,#numbers,1 do
    	io.write(numbers[i] .. ' ')
    end
    print()
    
    --#nums  获取数组长度
    
    
    

    5、新知识和疑问

  • 相关阅读:
    MFC tab页面中获到其它页面的数据
    sqlite数据库中"Select * From XXX能查到数据,但是Select DISTINCT group From xxx Order By group却查不出来
    关闭程序出现崩溃(exe 已触发了一个断点及未加载ucrtbased.pdb)
    springboot 通用Mapper使用
    springBoot 发布war包
    springCloud Zuul网关
    springboot hystrix turbine 聚合监控
    springBoot Feign Hystrix Dashboard
    springBoot Ribbon Hystrix Dashboard
    springBoot Feign Hystrix
  • 原文地址:https://www.cnblogs.com/Fflyqaq/p/11823468.html
Copyright © 2020-2023  润新知