java吧 关注:1,297,136贴子:12,832,293

写了一个貌似比快排更快的排序 (c#代码 跟java)

只看楼主收藏回复

为什么发java吧 因为j8 人多 c# 吧和unity吧人少
下面上代码


IP属地:浙江1楼2018-01-19 19:04回复
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    namespace 排序算法_正式版_整理
    {
    class Program
    {
    static void Main(string[] args)
    {
    Random rd = new Random(10);
    int[] array = new int[10000];
    for (int i = 0; i < array.Length; i++)
    {
    array[i] = rd.Next(1, 10000);
    }
    Console.WriteLine("原数组 排序算法_正式版_整理");
    foreach (var i in array)
    {
    //Console.Write(i + " ");
    }
    Console.WriteLine("");
    var startTime = DateTime.Now;
    Sort(array, 0, array.Length - 1);
    var delta = (DateTime.Now - startTime).ToString();
    Console.WriteLine("最终数组");
    foreach (var i in array)
    {
    //Console.Write(i + " ");
    }
    Console.WriteLine("");
    Check(array);
    Console.WriteLine(delta);
    Console.ReadKey();
    }
    static void Check(int[] array)
    {
    for (int i = 0; i < array.Length - 1; i++)
    {
    if (array[i] > array[i + 1])
    {
    Console.WriteLine("算法有问题" + array[i] + " " + array[i + 1]);
    return;
    }
    }
    Console.WriteLine("算法正确");
    }
    static void Sort(int[] array, int start, int end)
    {
    if (start == end)
    {
    return;
    }
    int length = end - start + 1;
    int avg = (array[start] + array[start + 1]) / 2;
    int avg2 = (array[start] + array[start + 1]);
    //int avg2 = (array[start] + array[end]);
    int mid = start;
    int left = start;
    int right = end;
    for (; left < right; right--)
    {
    if (array[right] * 2 < avg2)
    {
    mid = right;
    while (true)
    {
    if (array[left] * 2 >= avg2 && array[left] > array[right] && left < right)
    {
    int temp = array[left];
    array[left] = array[right];
    array[right] = temp;
    mid = left;
    break;
    }
    left++;
    if (left == right)
    {
    break;
    }
    }
    }
    }
    Sort(array, start, mid);
    Sort(array, mid + 1, end);
    }
    }
    }


    IP属地:浙江2楼2018-01-19 19:04
    回复
      2026-02-08 10:10:52
      广告
      不感兴趣
      开通SVIP免广告
      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
      namespace 快速排序
      {
      class Program
      {
      static void Main(string[] args)
      {
      Random rd = new Random(10);
      int[] array = new int[10000];
      for (int i = 0; i < array.Length; i++)
      {
      array[i] = rd.Next(1, 10000);
      }
      Console.WriteLine("原数组");
      //foreach (var i in array)
      //{
      ////Console.Write(i + " ");
      //}
      Console.WriteLine("");
      var startTime = DateTime.Now;
      sort(array, 0, array.Length - 1);
      //Array.Sort(array);
      var delta = (DateTime.Now - startTime).ToString();
      Console.WriteLine("最终数组");
      //foreach (var i in array)
      //{
      //Console.Write(i + " ");
      //}
      Console.WriteLine("");
      Check(array);
      Console.WriteLine(delta);
      Console.ReadKey();
      }
      static void Check(int[] array)
      {
      for (int i = 0; i < array.Length - 1; i++)
      {
      if (array[i] > array[i + 1])
      {
      Console.WriteLine("算法有问题" + array[i] + " " + array[i + 1]);
      return;
      }
      }
      Console.WriteLine("算法正确");
      }
      /**一次排序单元,完成此方法,key左边都比key小,key右边都比key大。
      **@param array排序数组
      **@param low排序起始位置
      **@param high排序结束位置
      **@return单元排序后的数组 */
      private static int sortUnit(int[] array, int low, int high)
      {
      int key = array[low];
      while (low < high)
      {
      /*从后向前搜索比key小的值*/
      while (array[high] >= key && high > low)
      --high;
      /*比key小的放左边*/
      array[low] = array[high];
      /*从前向后搜索比key大的值,比key大的放右边*/
      while (array[low] <= key && high > low)
      ++low;
      /*比key大的放右边*/
      array[high] = array[low];
      }
      /*左边都比key小,右边都比key大。//将key放在游标当前位置。//此时low等于high */
      array[low] = key;
      foreach (int i in array)
      {
      //Console.Write("{0}\t", i);
      }
      //Console.WriteLine();
      return high;
      }
      /**快速排序
      *@paramarry
      *@return */
      public static void sort(int[] array, int low, int high)
      {
      if (low >= high)
      return;
      /*完成一次单元排序*/
      int index = sortUnit(array, low, high);
      /*对左边单元进行排序*/
      sort(array, low, index - 1);
      /*对右边单元进行排序*/
      sort(array, index + 1, high);
      }
      }
      }


      IP属地:浙江3楼2018-01-19 19:04
      回复
        第一个我写的 第二个快速排序
        通过DateTime.Now 做时间差 得出 函数执行时间


        IP属地:浙江4楼2018-01-19 19:05
        回复
          那么问题来了
          我写的这个有没有什么问题
          还有没有可以优化的地方


          IP属地:浙江5楼2018-01-19 19:06
          回复
            目前百万数据排序测试 暂时没有出现bug


            IP属地:浙江6楼2018-01-19 19:06
            回复
              @alwing


              IP属地:浙江7楼2018-01-19 19:08
              回复
                真的 这次我不是为了水经验 而是探讨这个问题


                IP属地:浙江8楼2018-01-19 19:08
                回复
                  2026-02-08 10:04:52
                  广告
                  不感兴趣
                  开通SVIP免广告
                  基数排序最快


                  9楼2018-01-19 19:16
                  收起回复
                    大神呢.


                    IP属地:浙江10楼2018-01-19 19:45
                    回复
                      不可能有更快的了,排序算法的下界就是n*logn


                      IP属地:北京来自Android客户端11楼2018-01-19 20:05
                      收起回复
                        看不懂 反正我选冒泡


                        来自Android客户端12楼2018-03-05 21:49
                        回复
                          说得好我选择sort()


                          IP属地:江苏来自Android客户端14楼2018-03-05 22:36
                          回复
                            https://ke.qq.com/course/268297#tuin=1053cd17 打飞机游戏视频


                            15楼2018-03-05 22:51
                            回复
                              2026-02-08 09:58:52
                              广告
                              不感兴趣
                              开通SVIP免广告
                              我就没选择看


                              IP属地:浙江17楼2020-03-31 17:27
                              回复