C#实现快速排序(两种方法)

  1. //题目:快速排序
  2. //题目要求:实现快速排序算法,要求可以对目标数组的某一指定范围进行快速排序,轴(也称:基准)的位置允许选择。
  3. //现给出接口,如下:
  4. //
  5. numbers: 目标数组
  6. left:范围的左边界(当对全数组排序时,为0)
  7. right:范围的右边界(当对全数组排序时,为数组长度-1)
  8. pivot:轴(也称:基准)所在位置
  9. //
  10. //private void Sort(int[] numbers,  int left,  int right,int pivot)
  11. //{
  12. Finish this function, please
  13. //
  14. //}
  15. using System;
  16. namespace quickSort
  17. {
  18.     /// <summary>
  19.     /// Summary description for Class1.
  20.     /// </summary>
  21.     class MyQuickSort
  22.     {
  23.         /// <summary>
  24.         /// The main entry point for the application.
  25.         /// </summary>
  26.         
  27.         //调试用
  28.         static int n = 0;
  29.         static int n1 = 0;
  30.         [STAThread]
  31.         #region //入口函数
  32.         static void Main(string[] args)
  33.         {
  34.             int[] numbers = {1, 6, 2, 8, 3, 4, 5, 9, 10, 100, 50, 8, 9, 4, 4, 4, 4, 5, 1000, 600, 0, -2, -9};
  35.             int[] numbers1 = {1, 6, 2, 8, 3, 4, 5, 9, 10, 100, 50, 8, 9, 4, 4, 4, 4, 5, 1000, 600, 0, -2, -9};
  36.             int left = 0;
  37.             int right = numbers.Length - 1;
  38.             int pivot = 0;
  39.             //使用第一种方法对numbers中的指定元素段进行快速排序
  40.             //输出排序前的数组元素
  41.             Console.WriteLine("排序前:");
  42.             for (int i = 0; i < numbers.Length; ++i)
  43.             {
  44.                 Console.Write(numbers[i].ToString() + " ");
  45.             }
  46.             //此方法仅支持pivot为最左边元素
  47.             Sort(numbers, left, right, pivot);
  48.             //输出排序后的数组元素
  49.             Console.WriteLine("/n排序后:");
  50.             for (int i = 0; i < numbers.Length; ++i)
  51.             {
  52.                 Console.Write(numbers[i].ToString() + " ");
  53.             }
  54.             Console.WriteLine();
  55.             //使用第二种方法对numbers中的指定元素段进行快速排序
  56.             //输出排序前的数组元素
  57.             Console.WriteLine("排序前:");
  58.             for (int i = 0; i < numbers1.Length; ++i)
  59.             {
  60.                 Console.Write(numbers1[i].ToString() + " ");
  61.             }
  62.             //此方法pivot可为任意值
  63.             Sort1(numbers1, left, right, pivot);
  64.             //输出排序后的数组元素
  65.             Console.WriteLine("/n排序后:");
  66.             for (int i = 0; i < numbers1.Length; ++i)
  67.             {
  68.                 Console.Write(numbers1[i].ToString() + " ");
  69.             }
  70.             Console.WriteLine();
  71.         }
  72.         #endregion
  73.         #region //实现快速排序--方法一
  74.         //注意:将前++改为后++后各个数值以及判断条件的不同,这里不再列举
  75.         //此方法仅支持pivot为最左边元素
  76.         //numbers: 目标数组
  77.         //left:范围的左边界(当对全数组排序时,为0)
  78.         //right:范围的右边界(当对全数组排序时,为数组长度-1)
  79.         //pivot:轴(也称:基准)所在位置
  80.         private static void Sort(int[] numbers, int left, int right, int pivot)
  81.         {
  82.             if (left < 0 || left > numbers.Length - 1 || right < 0 || right > numbers.Length - 1)
  83.             {
  84.                 Console.WriteLine("/n左右边界越界!");
  85.                 return;
  86.             }
  87.             if (pivot > right || pivot < left)
  88.             {
  89.                 Console.WriteLine("/n基准点越界!");
  90.                 return;
  91.             }
  92.             int l = left;
  93.             int r = right + 1;
  94.             int temp = numbers[pivot];
  95.             while (true)
  96.             {
  97.                 //自左至右找到第一个大于基准的点
  98.                 while (l <= right - 1 && numbers[++l] < temp);
  99.                 //自右至左找到第一个小于基准的点
  100.                 while (r >= left + 1 && numbers[--r] > temp);
  101.                 if (l >= r)
  102.                 {
  103.                     break;
  104.                 }
  105.                 //交换左边找到的点和右边找到的点
  106.                 int t = numbers[l];
  107.                 numbers[l] = numbers[r];
  108.                 numbers[r] = t;
  109.                 //调试信息
  110.                 n++;
  111.                 Console.WriteLine("/n第" + n.ToString() + "次交换后!");
  112.                 for (int i = left; i < right + 1; ++i)
  113.                 {
  114.                     Console.Write(numbers[i].ToString() + " ");
  115.                 }
  116.             }
  117.             //交换基准与r
  118.             numbers[pivot] = numbers[r];
  119.             numbers[r] = temp;
  120.             //调试信息
  121.             n++;
  122.             Console.WriteLine("/n第" + n.ToString() + "次交换后!");
  123.             for (int i = left; i < right + 1; ++i)
  124.             {
  125.                 Console.Write(numbers[i].ToString() + " ");
  126.             }
  127.             if (left < r - 1)
  128.             {
  129.                 Sort(numbers, left, r - 1, left);
  130.             }
  131.             if (r + 1 < right)
  132.             {
  133.                 Sort(numbers, r + 1, right, r + 1);
  134.             }           
  135.         }
  136.         #endregion
  137.         #region //实现快速排序--方法二
  138.         //此方法pivot可为任意值
  139.         //numbers: 目标数组
  140.         //left:范围的左边界(当对全数组排序时,为0)
  141.         //right:范围的右边界(当对全数组排序时,为数组长度-1)
  142.         //pivot:轴(也称:基准)所在位置
  143.         private static void Sort1(int[] numbers, int left, int right, int pivot)
  144.         {
  145.             if (left < 0 || left > numbers.Length - 1 || right < 0 || right > numbers.Length - 1)
  146.             {
  147.                 Console.WriteLine("/n左右边界越界!");
  148.                 return;
  149.             }
  150.             if (pivot > right || pivot < left)
  151.             {
  152.                 Console.WriteLine("/n基准点越界!");
  153.                 return;
  154.             }
  155.             int l = left;
  156.             int r = right;
  157.             int temp = numbers[pivot];   //基准的值
  158.             int low = pivot;  //基准的位置
  159.             while (l < r)
  160.             {
  161.                 //自右至左找到第一个小于基准的点
  162.                 while (numbers[r] >= temp && l < r && r >= low)
  163.                 {
  164.                     --r;
  165.                 }
  166.                 //如果右边第一个小于基准的点在基准点左边,则不交换
  167.                 if (r < low)
  168.                 {
  169.                     r = low;
  170.                 }
  171.         
  172.                 if (l < r && r != low)
  173.                 {
  174.                     //将 找到的值 移到基准所在的位置
  175.                     numbers[low] = numbers[r];
  176.                     //将基准的位置移到 找到的值 的位置
  177.                     low = r;
  178.                     //调试信息
  179.                     ++n1;
  180.                     Console.WriteLine("/n第" + n1.ToString() + "次交换后!");
  181.                     for (int i = left; i < right + 1; ++i)
  182.                     {
  183.                         Console.Write(numbers[i].ToString() + " ");
  184.                     }
  185.                     Console.Write("low= " + low.ToString());
  186.                 }
  187.                 //自左至右找到第一个大于基准的点
  188.                 while (numbers[l] <= temp && l < r && l <= low)
  189.                 {
  190.                     ++l;
  191.                 }
  192.                 //如果左边第一个大于基准的点在基准点右边,则不交换
  193.                 if (l > low)
  194.                 {
  195.                     l = low;
  196.                 }
  197.                 if (l < r && l != low)
  198.                 {
  199.                     //将 找到的值 移到基准所在的位置
  200.                     numbers[low] = numbers[l];
  201.                     //将基准的位置移到 找到的值 的位置
  202.                     low = l;
  203.                     //调试信息
  204.                     ++n1;
  205.                     Console.WriteLine("/n第" + n1.ToString() + "次交换后!");
  206.                     for (int i = left; i < right + 1; ++i)
  207.                     {
  208.                         Console.Write(numbers[i].ToString() + " ");
  209.                     }
  210.                     Console.Write("low= " + low.ToString());
  211.                 }
  212.             }
  213.             //将基准值移到基准位置
  214.             numbers[low] = temp;
  215.             if (left < l - 1)
  216.             {
  217.                 Sort1(numbers, left, low - 1, left);
  218.             }
  219.             if (l + 1 < right)
  220.             {
  221.                 Sort1(numbers, low + 1, right, l + 1);
  222.             }           
  223.         }
  224.         #endregion
  225.     }
  226. }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值