• 插入排序


    直接插入排序:时间复杂度为0(n^2)

    第i个元素之前的元素已经排序好了,要把数组中的第i个元素排入已经排好的元素中,i要与i-1,i-2.......等元素比较,i大于他们就终止排序,i小于i-1或其他的就把i与他们交换,实现排序的功能

    using System;
    using System.Collections.Generic;
    using System.Diagnostics;//StopWatch类的命名空间
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace 直接插入排序
    {
        class Program
        {
            static void Main(string[] args)
            {
                int[] array = new int[] { 42, 20, 99, 12, 44, 4, 66, 88, 24, 93 ,1,22};//需要排序的数组
                Stopwatch watch = new Stopwatch();//创建StopWatch类的对象
                watch.Start();//调用类中的start函数开始计时
                Sort(array);//调用直接插入排序函数对数组进行排序
                watch.Stop();//调用StopWatch类中的stop函数,终止计时
                Console.WriteLine(watch.Elapsed);//输出直接插入排序的用时
                foreach (var item in array)//输出已近排序好的数组
                {
                    Console.WriteLine(item);
                }
                Console.ReadKey();
            }
            /// <summary>
            /// 直接插入排序
            /// </summary>
            /// <param name="array"></param>
            public static void Sort(int[] array)
            {
                for (int i = 1; i < array.Length; i++)//对数组从第二个数开始排序
                {
                    int temp = array[i];
                    for(int j=i-1;j>=0;j--)
                    {
                       if(temp<array[j])
                        {
                           array[j + 1] = array[j];
                           array[j] = temp;
                        }
                        else
                        {
                          
                            break;//已近排序好本次数组了,终止排序
                        }
                    }
                }
            }
        }
    }

    折半插入排序:是将要插入的值与有序数组[low mid high]的中间元素mid进行比较,大于中间元素mid,就与[mid high]的中间元素比较,小于mid就与[low mid]的中间元素进行比较。不断循环,达到对数组进行排序的效果

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace 折半插入排序
    {
        class Program
        {
            static void Main(string[] args)
            {
                int[] array = new int[] { 53, 27, 36, 15, 69, 42 };
                BInsertSort(array);
                foreach (var item in array)
                {
                    Console.WriteLine(item);
                }
                Console.ReadKey();
            }
    
            private static void BInsertSort(int[] array)
            {
                for (int i = 1; i < array.Length; i++)
                {
                    int low = 0;
                    int high = i - 1;
                    while (low <= high)//当数组中low>high时,mid就是要插入值插入数组中的位置
                    {
                        int mid = (low + high) / 2;
                        if (array[mid] > array[i])//要插入的值小于数组中间值,缩小数组
                        {
                            high = mid - 1;
                        }
                        else
                        {
                            low = mid + 1;
                        }
                    }
                    for (int j = i - 1; j >= high + 1; j--)
                    {
                        int temp = array[j + 1];
                        array[j + 1] = array[j];
                        array[j] = temp;
    
                    }
                }
            }
        }
    }
     

    希尔排序:按一定间隔将数组分成若干个数组,每个数组再进行直接插入排序。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace 希尔排序
    {
        class Program
        {
            static void Main(string[] args)
            {
                int[] array = new int[] { 53, 27, 36, 15, 69, 42 };
                BInsertSort(array);
                foreach (var item in array)
                {
                    Console.WriteLine(item);
                }
                Console.ReadKey();
            }
    
            private static void BInsertSort(int[] array)
            {
                int gap = array.Length;//排序因子
                do
                {
                    gap = gap / 3 + 1;//计算步长因子的
                    for (int i = gap; i < array.Length; i++)//按步长因子组成的数组,对它进行直接插入排序
                    {
                        int temp = array[i];
                        int j;
                        for (j = i; j >= gap; j -= gap)
                        {
                            if (array[j - gap] > temp)
                            {
                                array[j] = array[j - gap];
    
                            }
                            else
                            {
                                break;
                            }
    
                        }
                        array[j] = temp;
    
                    }
    
                } while (gap > 1);
            }
        }
    }
  • 相关阅读:
    [Java] Hibernate
    python基础(十三):函数(一)公共操作
    python基础(十二):数据结构(五)集合
    python基础(十二):数据结构(四)字典
    python基础(十一):数据结构(三)元组
    python基础(十):数据结构(二)列表
    python基础(八):流程控制(五)循环
    python基础(七):流程控制(一)if
    python基础(六):运算符
    python基础(五):转换数据类型
  • 原文地址:https://www.cnblogs.com/zhangyang4674/p/11332994.html
Copyright © 2020-2023  润新知