zoukankan      html  css  js  c++  java
  • 排序算法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、新知识和疑问

  • 相关阅读:
    J2EE中常用的名词解释
    java中的构造方法
    String s = new String("xyz");创建了几个StringObject?
    MySQL 学习笔记
    《SQL 必知必会》建表语句
    《SQL 必知必会》读书笔记
    IDEA 中项目代码修改后不自动生效,需要执行 mvn clean install 才生效
    curl 使用指南
    MySQL字段添加注释,但不改变字段的类型
    《痞子衡嵌入式半月刊》 第 14 期
  • 原文地址:https://www.cnblogs.com/Fflyqaq/p/11823468.html
Copyright © 2011-2022 走看看