排序算法

冒泡排序

两数相比,大数放后
时间复杂度为O(n²)

BubbleSort.cs
    public class BubbleSort
    {
        public static void bubbleSort(ref int[] a)
        {
            int m=a.Length;
            for(int i=0;i<m;i++)
            {
                for(int j=0;j<m-1-i;j++)
                {
                    if(a[j]>a[j+1])
                    {
                        int temp=a[j];
                        a[j]=a[j+1];
                        a[j+1]=temp;
                    }
                }
            }
        }
    }
Program.cs
    class Test
    {
    static void Main(string[] arg)
    {
        int[] A=new int[]{12,8,9,1,15,2,7,20,30};
        BubbleSort.bubbleSort(ref A);
        foreach (var item in A)
        {
            System.Console.WriteLine(item);
        }
    }
    }
泛型
    public class BubbleSort
    {
        public static void bubbleSort<T>(ref T[] a)where T:IComparable<T>
        {
            int m=a.Length;
            for(int i=0;i<m;i++)
            {
                for(int j=0;j<m-1-i;j++)
                {
                    if(a[j].CompareTo(a[j+1])>0)
                    {
                        T temp=a[j];
                        a[j]=a[j+1];
                        a[j+1]=temp;
                    }
                }
            }
        }
    }

选择排序

选择数组中最小的值,将其插回前面
时间复杂度为O(n²)

SelectSort.cs
    public class SelectSort
    {
        public static void selectSort<T>(ref T[] a)where T:IComparable<T>
        {
            int m=a.Length;
            for(int i=0;i<m;i++)
            {
                int min=i;
                for(int j=i+1;j<m;j++)
                {
                    if(a[j].CompareTo(a[min])<0)
                    {
                        min=j;
                    }
                }
                T temp=a[min];
                a[min]=a[i];
                a[i]=temp;
            }
        }
    }

插入排序

每次都与前面的数相比,前面的数大于此时所指定的数,则右移
时间复杂度O(n²)

InsertSort.cs
    public class InsertSort
    {
        public static void Sort(ref int[] a)
        {
            int n=a.Length;
            for(int i=1;i<n;i++)
            {
                int e=a[i];
                int j;
                for(j=i;j>0;j--)
                {
                    if(e<a[j-1])
                        a[j]=a[j-1];
                    else
                        break;
                }
                a[j]=e;
            }
        }
    }

归并排列

时间复杂度O(nlogn)

中间左右必须是有序数组
    public class MergaSort
    {
        public static void Sort(int [] arr,int l,int r)
        {
            int[] temp=new int[arr.Length];
            int mid=l+(r-l)/2;
            Merga(arr,temp,l,mid,r);
        }

        public static void Merga(int[] arr,int[] temp,int l,int mid,int r)
        {
            int i=l;
            int j=mid+1;
            int k=l;
            while(i<=mid&&j<=r)
            {
                if(arr[i]<arr[j])
                {
                    temp[k++]=arr[i++];
                }
                else
                {
                    temp[k++]=arr[j++];
                }
            }

                while(i<=mid)
                {
                    temp[k++]=arr[i++];
                }
               while(j<=r)
                {
                    temp[k++]=arr[j++];
                }
            
            for(int z=l;z<=r;z++)
            {
                arr[z]=temp[z];
            }
        }       
    }
左右无需有序
    public class MergaSort
    {
        public static void Sort(int [] arr)
        {
            int[] temp=new int[arr.Length];
            Rank(arr,temp,0,arr.Length-1);
        }

        public static void Rank(int[] arr,int[] temp,int l,int r)
        {
            if(l>=r) return;
            int mid=l+(r-l)/2;
            Rank(arr,temp,l,mid);
            Rank(arr,temp,mid+1,r);
            Merga(arr,temp,l,mid,r);
        }

        public static void Merga(int[] arr,int[] temp,int l,int mid,int r)
        {
            int i=l;
            int j=mid+1;
            int k=l;
            while(i<=mid&&j<=r)
            {
                if(arr[i]<arr[j])
                {
                    temp[k++]=arr[i++];
                }
                else
                {
                    temp[k++]=arr[j++];
                }
            }

                while(i<=mid)
                {
                    temp[k++]=arr[i++];
                }
               while(j<=r)
                {
                    temp[k++]=arr[j++];
                }
            
            for(int z=l;z<=r;z++)
            {
                arr[z]=temp[z];
            }
        }       
    }

快速排列

时间复杂度O(nlogn)

针对随机数组
    public class Quick
    {
        public static void Sort(int[] arr,int l,int r)
        {
            if(l>=r) return;

            int v=arr[l];
            int j=l;
            for(int i=l+1;i<=r;i++)
            {
                if(arr[i]<v)
                {
                    j++;
                    Swap(arr,i,j);
                }
            }
            Swap(arr,j,l);
            Sort(arr,l,j-1);
            Sort(arr,j+1,r);
        }

        public static void Swap(int[] arr,int i,int j)
        {
            int e=arr[i];
            arr[i]=arr[j];
            arr[j]=e;
        }
    }
有序数组
    public class Quick
    {
        private static Random random=new Random();
        public static void Sort(int[] arr,int l,int r)
        {
            if(l>=r) return;


            int p=l+random.Next(r-l+1);
            Swap(arr,l,p);

            int v=arr[l];
            int j=l;
            for(int i=l+1;i<=r;i++)
            {
                if(arr[i]<v)
                {
                    j++;
                    Swap(arr,i,j);
                }
            }
            Swap(arr,j,l);
            Sort(arr,l,j-1);
            Sort(arr,j+1,r);
        }

        public static void Swap(int[] arr,int i,int j)
        {
            int e=arr[i];
            arr[i]=arr[j];
            arr[j]=e;
        }
    }
大量重复数据
        public static void Three(int[] arr,int l,int r)
        {
            if(l>=r) return;

            int v=arr[l];
            int lt=l;
            int gt=r+1;
            int i=l+1;

            while(i<gt)
            {
                if(arr[i]<v)
                {
                    lt++;
                    Swap(arr,i,lt);
                }
                if(arr[i]>v)
                {
                    gt--;
                    Swap(arr,i,gt);
                }
                else
                {
                    i++;
                }
            }
            Swap(arr,l,lt);
            Sort(arr,l,lt-1);
            Sort(arr,gt,r);
        }
    }

猴子排序

点击查看代码
    public class Monkey
    {
        public static void MonkeySort(int[] arr)
        {
            int count=0;
            
            while(!Checkout(arr))
            {
                Sort(arr);
                count++;
            }
            System.Console.WriteLine($"最终排列次数:{count}");
        }

        public static void Sort(int[] arr)
        {
            Random random=new Random();
            int temp;
            for(int index=0;index<arr.Length;index++)
            {
                int j=random.Next(arr.Length);
                temp=arr[j];
                arr[j]=arr[index];
                arr[index]=temp;
            }
        }


        //判断是否有序
        public static bool Checkout(int[] arr)
        {
            for(int i=0;i<arr.Length-1;i++)
            {
                if(arr[i]>arr[i+1])
                {
                    return false;
                }
            }
            return true;
        }
    }
posted @ 2022-02-25 15:43  Ariaaaaa  阅读(4)  评论(0)    收藏  举报