zoukankan      html  css  js  c++  java
  • 几种排序算法

       static void Main(string[] args)
            {
                int[] intArray = { 7, 5, 3, 4, 1, 6, 2, 9, 8, 0 ,12,14,43,44,13,16,15};
                QuickSort(intArray);
                for (int i = 0; i < intArray.Length; i++)
                {
                    Console.WriteLine(intArray[i]);
                }
                Console.ReadKey();
            }
            #region 选择排序
            public static void SelectSort(IList<int> data)
            {
                for (int i = 0; i < data.Count - 1; i++)
                {
                    int temp = data[i];
                    int min = i;
                    //每次一个内循环选出一个最小的
                    for (int j = i + 1; j < data.Count; j++)
                    {
                        if (data[j] > temp)
                        {
                            min = j;
                            temp = data[j];
                        }
                    }
                    //将这个内循环选出的最小的放在前面
                    if (min != i)
                    {
                        Swap(data, min, i);
                    }
                }
            }
            /// <summary>
            /// 交换数据
            /// </summary>
            /// <param name="data"></param>
            /// <param name="min"></param>
            /// <param name="i"></param>
            private static void Swap(IList<int> data, int min, int i)
            {
                int temp;
                temp = data[min];
                data[min] = data[i];
                data[i] = temp;
            }
    
            #endregion
    
            #region 冒泡排序
            public static void BubbleSort(IList<int> data)
            {
                for (int i = data.Count-1; i >0 ; i--)
                {
                    for (int j = 0; j < i; j++)
                    {
                        if (data[i]>data[j])
                        {
                            Swap(data,i,j);     
                        }
                    }
                }
            }
            #endregion
    
            #region 鸡尾酒排序
            public static void BubbleCocktailSort(IList<int> data)
            {
                //需要来回a,length/2趟
                for (int i = 0; i < data.Count/2; i++)
                {
                    //类冒泡,交换最大值至右端
                    for (int j  = i; j+1 < data.Count-i ; j++)
                    {
                        if (data[j]>data[j+1])
                        {
                            Swap(data,j,j+1);
                        }
                    }
                    //类冒泡,交换最小值至左端
                    for (int m = data.Count-1-i; m >i; m--)
                    {
                        if (data[m - 1] > data[m])
                        {
                            Swap(data, m, m - 1);
                        }
                    }
                }
            }
            #endregion
    
            #region 插入排序
            
           
            public static void insertionSort(IList<int> data)
            {
                for (int i = 1; i < data.Count; i++)
                {
                    if (data[i]<data[i-1])
                    {
                        int temp=data[i];
                        int j;
                        //执行到此步骤时,data[i]之前的都已经完成了排序,将data[i]插入到一个合适的位置
                        for (  j=i ; j>0 && data[j-1]>temp ;   j--)
                        {
                            data[j] = data[j - 1];
                          
                        }
                        data[j] = temp;
    
                    }
                }
            }
            #endregion
    
            #region 快速排序
            public static void QuickSort(int[] numbers)
            {
                //Sort(numbers, 0, numbers.Length - 1);
                quick_sort(numbers, 0, numbers.Length-1);
            }
    
            private static void Sort(int[] numbers, int left, int right)
            {
                if (left < right)
                {
                    int middle = numbers[(left + right) / 2];
                    int i = left - 1;
                    int j = right + 1;
                    while (true)
                    {
                        while (numbers[++i] < middle) ;
    
                        while (numbers[--j] > middle) ;
    
                        if (i >= j)
                            break;
    
                        Swap(numbers, i, j);
                    }
    
                    Sort(numbers, left, i - 1);
                    Sort(numbers, j + 1, right);
                }
            }
            #endregion
  • 相关阅读:
    BZOJ1057:[ZJOI2007]棋盘制作——题解
    洛谷4147:玉蟾宫——题解
    洛谷1578:[WC2002]奶牛浴场——题解
    BZOJ1926:[SDOI2010]粟粟的书架——题解
    BZOJ3123:[SDOI2013]森林——题解
    BZOJ1834:[ZJOI2010]网络扩容——题解
    BZOJ2668:[CQOI2012]交换棋子——题解
    BZOJ1070:[SCOI2007]修车——题解
    BZOJ1877:[SDOI2009]晨跑——题解
    在阿里,我们如何管理测试环境
  • 原文地址:https://www.cnblogs.com/wanglao/p/3598924.html
Copyright © 2011-2022 走看看