各种排序算法汇集

View Code
        private void Sort1(int[] list)//冒泡排序
        {
            //从第一个字符向后冒泡亮亮比较获取最大值放在最后
            //第一次循环首先得到一个最大值;第二次循环得到第二大值
            int i, j, temp;
            bool done = false;
            j = 1;
            while ((j < list.Length) && (!done))
            {
                done = true;
                for (i = 0; i < list.Length - j; i++)
                {
                    if (list[i] > list[i + 1])
                    {
                        done = false;
                        temp = list[i];
                        list[i] = list[i + 1];
                        list[i + 1] = temp;
                    }
                }
                j++;
            }
        }
        //选择排序
        //向后冒泡获取最小值的索引,然后和第i个值进行数据交换
        private void Sort2(int[] list)
        {
            int minIndex = 0;
            for (int i = 0; i < list.Length; i++)
            {
                minIndex = i;
                for (int j = i; j < list.Length; j++)
                {
                    if (list[j] < list[minIndex])
                    {
                        minIndex = j;
                    }
                }
                int temp = list[i];
                list[i] = list[minIndex];
                list[minIndex] = temp;
            }
        }
        //插入排序
        //此种算法是首先循环第二个元素,让第二个元素和第一个元素比较,如果i+1<i,交换。
        //然后依次进行,如果是循环第i个元素,i索引的数据将会和前边所有的数据进行比较,如果i索引数据小于后边的数据,则继续下去知道最后一个进行替换,否则跳出继续下一个;

        private void Sort3(int[] list)
        {
            for (int i = 1; i < list.Length; i++)
            {
                int t = list[i];
                for (int j = i; j > 0; j--)
                {
                    if (list[j - 1] > t)
                    {
                        list[j] = list[j - 1];
                        list[j - 1] = t;
                    }
                }
            }
        }
        private void Sort4(int[] list)//希尔排序
        {
            //list.Length=25;
            int inc;
            for (inc = 1; inc <= list.Length / 9; inc = 3 * inc + 1) ;
            for (; inc > 0; inc = inc / 3)
            {
                for (int i = inc + 1; i <= list.Length; i += inc)
                {
                    int t = list[i - 1];
                    int j = i;
                    while ((j > inc) && (list[j - inc - 1] > t))
                    {
                        list[j - 1] = list[j - inc - 1];
                        j -= inc;
                    }
                    list[j - 1] = t;
                }
            }
        }
        //快速排序
        private void quick_sort(int[] s, int l, int r)
        {
            if (l < r)
            {
                int i = l, j = r, data = s[l];
                while (i < j)
                {
                    while (i < j && s[j] >= data) // 从右向左找第一个小于x的数
                    {
                        j--;
                    }
                    if (i < j)
                    {
                        s[i] = s[j];
                        i++;
                    }

                    while (i < j && s[i] < data) // 从左向右找第一个大于等于x的数
                    {
                        i++;
                    }
                    if (i < j)
                    {
                        s[j] = s[i];
                        j--;
                    }
                }
                s[i] = data;//第一次循环获取的是左边的数据都比data小的数据,右边的大于data的数据
                quick_sort(s, l, i - 1); // 递归调用
                quick_sort(s, i + 1, r);
            }
        }
原文地址:https://www.cnblogs.com/TNSSTAR/p/2650762.html