插入排序

直接插入排序:时间复杂度为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);
        }
    }
}
原文地址:https://www.cnblogs.com/zhangyang4674/p/11332994.html