zoukankan      html  css  js  c++  java
  • 自娱自乐之快速排序

    既然能把冒泡KO掉,马上就激起我们的兴趣,tnd快排咋这么快,一定要好好研究一下。

    首先上图:   

    从图中我们可以看到:

    left指针,right指针,base参照数。

    其实思想是蛮简单的,就是通过第一遍的遍历(让left和right指针重合)来找到数组的切割点。

    第一步:首先我们从数组的left位置取出该数(20)作为基准(base)参照物。

    第二步:从数组的right位置向前找,一直找到比(base)小的数,

                如果找到,将此数赋给left位置(也就是将10赋给20),

                此时数组为:10,40,50,10,60,

                left和right指针分别为前后的10。

    第三步:从数组的left位置向后找,一直找到比(base)大的数,

                 如果找到,将此数赋给right的位置(也就是40赋给10),

                 此时数组为:10,40,50,40,60,

                 left和right指针分别为前后的40。

    第四步:重复“第二,第三“步骤,直到left和right指针重合,

                 最后将(base)插入到40的位置,

                 此时数组值为: 10,20,50,40,60,至此完成一次排序。

    第五步:此时20已经潜入到数组的内部,20的左侧一组数都比20小,20的右侧作为一组数都比20大,

                以20为切入点对左右两边数按照"第一,第二,第三,第四"步骤进行,最终快排大功告成。

       1:  using System;
       2:  using System.Collections.Generic;
       3:  using System.Linq;
       4:  using System.Text;
       5:   
       6:  namespace ConsoleApplication6
       7:  {
       8:      class Program
       9:      {
      10:          static void Main(string[] args)
      11:          {
      12:              List<int> list = new List<int>() { 565, 5, 5, 4156, 15, 6, 84, 641, 5, 4, 98 };
      13:              list = Sort(list, 0, list.Count - 1);
      14:              foreach (int i in list)
      15:              {
      16:                  Console.Write(i + " ");
      17:              }
      18:              Console.ReadLine();
      19:          }
      20:          static int Device(List<int> list, int left, int right)
      21:          {
      22:              int baseNum = list[left];
      23:              while (left < right)
      24:              {
      25:                  while (left < right && baseNum <= list[right])
      26:                      right--;
      27:                  list[left] = list[right];
      28:                  while (left < right && baseNum >= list[left])
      29:                      left++;
      30:                  list[right] = list[left];
      31:              }
      32:              list[left] = baseNum;
      33:              return left;
      34:          }
      35:          /// <summary>
      36:          /// 快速排序是将数据分成无数个两份,每份数据取一个中心点,然后无限的以中心数分解下去,中心数也就相当于基数,基数的两边必定是一边大于基数,一边小于基数的,所以一直分解到基数的两边只有两个数字的时候,排序完成
      37:          /// </summary>
      38:          /// <param name="list"></param>
      39:          /// <param name="left"></param>
      40:          /// <param name="right"></param>
      41:          /// <returns></returns>
      42:          static List<int> Sort(List<int> list, int left, int right)
      43:          {
      44:              int i = 0;
      45:              if (left < right)
      46:              {
      47:                  i = Device(list, left, right);
      48:                  Sort(list, left, i - 1);
      49:                  Sort(list, i + 1, right);
      50:              }
      51:              return list;
      52:          }
      53:      }
      54:  }
  • 相关阅读:
    mysql主从复制
    nginx代理tcp协议连接mysql
    spark安装配置
    DataX 3.0简介 安装及使用
    Consul 快速入门
    Etcd 使用入门
    常见负载均衡算法
    Container is running beyond memory limits
    HADOOP_MAPRED_HOME=${full path of your hadoop distribution directory}
    快速搞定Windows10环境下hadoop安装和配置
  • 原文地址:https://www.cnblogs.com/djzny/p/3492729.html
Copyright © 2011-2022 走看看