算法 简单的排序

插入排序

把数组分为两个序列 一个是有序的一个是无序的 拿无序的和有序中的比较,如果所选元素比无序的小整体后移,注意最后的索引

 static void InsertSort(int []arry)
        {
            for(int i=1;i<arry.Length;i++)
            {
                int temp = arry[i];

                if (arry[i] < arry[i - 1])
                {
                    int j;
                    for(j=i-1;j>=0&&arry[j]>temp;j--)
                    {
                        arry[j + 1] = arry[j];
                    }

                    arry[j+1] = temp; // 注意索引
                }             
            }
        }

选择排序

选出数组中最小的元素看看是不是在a[0]的位置,如果不是两个元素对调,然后选择数组中第二小的元素,看看他的位置是不是在a[1],不是的话对调…

static void SelectOnSrot(int []arry)
        {
            for(int i=0;i<arry.Length;i++)
            {
                int min = i;

                for (int j=i+1; j < arry.Length; j++)
                {
                    if(arry[j]<arry[min])
                    {
                        min = j;
                    }
                }

                if(min==i)
                {
                    continue;

                }
                else
                {
                    int temp = arry[i];
                    arry[i] = arry[min];
                    arry[min] = temp;
                }
           
            }
        }

快速排序

在数组中选出一个基值通常是a[0],然后比他小的放他左边比他大的放他右边,然后通过递归继续划分,直至排出顺序。

 static void QuickSort(int[] arry,int left,int right)
        {           
            if(left<right)
            {
                int x = arry[left];
                int i = left;
                int j = right;

                while (true && i < j)
                {

                    ///从后往前比较,如果right大于x值 right --,如果right值小于等于x值 把right赋值给left
                    while (true && i < j)
                    {
                        if (arry[j] <= x)
                        {
                            arry[i] = arry[j];
                            break;
                        }
                        else
                        {
                            j--;
                        }
                    }
                    ///从前往后比较,如果left值小于x left--,如果left值大于等于x值 left赋值给right
                    while (true && i< j)
                    {
                        if (arry[i] > x)
                        {
                            arry[j] = arry[i];
                            break;
                        }
                        else
                        {
                            i++;
                        }
                    }
                }

                arry[i] = x;
                QuickSort(arry, left, i - 1);
                QuickSort(arry, i + 1, right);
            }         
        }

归并排序

个人感觉归并排序是分治算法和动态规划算法的结合,首先把一个数组分成两部分,然后对两部分进行分别排序然后合并,在这个排序的基合并的础上,再把它一分为二,直到分的不能再分。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 归并排序
{
    class Program
    {
        static int[] arry = new int[] { 1, 4, 7, 5, 3, 2, 9, 6 };
        static int[] tempArry = new int[arry.Length];
        static void Main(string[] args)
        {                  
            MergeSort(arry, tempArry, 0, 7);

            for(int i=0;i<arry.Length;i++)
            {
                Console.Write(" " + arry[i]);
            }
            Console.ReadKey();
          
        }

        /// <summary>
        /// 把数组分成两个部分
        /// </summary>
        /// <param name="arry"></param>
        /// <param name="tempArry"></param>
        /// <param name="leftStart"></param>
        /// <param name="rightEnd"></param>
        static void MergeSort(int []arry,int []tempArry,int leftStart,int rightEnd)
        {
            if(leftStart<rightEnd)
            {
                int middle = (leftStart + rightEnd) / 2;

                MergeSort(arry, tempArry, leftStart, middle);
                MergeSort(arry, tempArry, middle+1, rightEnd);
                Merge(arry, tempArry, leftStart, middle+1, rightEnd);
            }
        }

        /// <summary>
        /// 对数组进行排序和合并,在排序的基础上已经进行了合并
        /// </summary>
        /// <param name="arry"></param>
        /// <param name="tempArry"></param>
        /// <param name="leftStart"></param>
        /// <param name="center"></param>
        /// <param name="rightEnd"></param>
        static void Merge(int []arry,int []tempArry,int leftStart,int center,int rightEnd)
        {
            int leftEnd = center - 1;
            int temp = leftStart;

            int rightStart = center;
            int eleNum = rightEnd - leftStart+1;

            //合并的算法:这个数组分为两部分从leftStart到center再从center到righEnd然后把小的值放在临时数组里(ps:这里通常最后一个值没有赋值到临时数组里)
            while(leftStart<=leftEnd&&rightStart<=rightEnd)
            {
                if (arry[leftStart] < arry[rightStart])
                {
                    tempArry[temp++] = arry[leftStart++];
                }
                else
                {
                    tempArry[temp++] = arry[rightStart++];
                }
            }

            //这里数组剩下的值赋给临时数组,因为在上边leftStart赋值之后自加他的值会不满足判断条件
            while (leftStart <= leftEnd)
            {
                tempArry[temp++] = arry[leftStart++];
            }

            while (rightStart <= rightEnd)
            {
                tempArry[temp++] = arry[rightStart++];
            }
            


            for (int i=0;i<eleNum;i++,rightEnd--)
            {
                
                arry[rightEnd] = tempArry[rightEnd];
            }

            for(int i = 0;i<tempArry.Length;i++)
            {
                Console.Write(tempArry[i]+" ");
            }
            Console.WriteLine("temparry");
            for (int i = 0; i < arry.Length; i++)
            {
                Console.Write(arry[i] + " ");
            }
            Console.WriteLine("arry");
        }

    }
}

希尔排序

把一个数组分成几个部分(按增量来分),对他们每个部分进行插入排序,然后将增量减小,在排序,其实是在原数组上进行操作。


using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 希尔排序
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] arry = new int[] { 7, 5, 2, 3, 8, 10, 4, 1 };

            for(int gap=arry.Length/2;gap>0;gap/=2)
            {
                for(int i=gap;i<arry.Length;i++)
                {
                    Insert(arry, gap, i);


                }
            }



            for(int i=0;i<arry.Length;i++)
            {

                System.Console.WriteLine(arry[i]);

            }
            System.Console.ReadKey();

            

        }

        static void Insert(int []arry,int gap,int i)
        {
            int index = arry[i];
            int j;
            for(j=i-gap;j>=0&&index<arry[j];j-=gap)
            {
                arry[j + gap] = arry[j];
            }
            arry[j + gap] = index;


        }
    }
}

这个博客有讲解有讲解
https://blog.youkuaiyun.com/qq_39207948/article/details/80006224?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160367480919724822561556%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=160367480919724822561556&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v28-2-80006224.first_rank_ecpm_v3_pc_rank_v2&utm_term=%E5%B8%8C%E5%B0%94%E6%8E%92%E5%BA%8F&spm=1018.2118.3001.4187

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值