C#快速排序

最近想把几大经典的排序算法系统的整理过一遍,写下笔记,算是复习吧!!

1、快速排序。

  快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列——来自百度百科。

  假设我们要对数组Array 6  7  2  1  9  4  3  10  5  8排序,先在序列中找任意一个数(此例取第一个)作为基准数(就是一界限,大于此数放序列的右边小于或等于放左边)

下标

0

1

2

3

4

5

6

7

8

9

6

7

2

1

9

4

3

10

5

8

初始化:i=0,j=9,基准数 X=6

从j开始往前找一个小于或等于X的数,

当j=8时,Array [0] = Array[8](i++),数组变为:

下标

0

1

2

3

4

5

6

7

8

9

5

7

2

1

9

4

3

10

5

8

从i开始往后找一个比X大的数,

当i=1时,Array[8]= Array[1](j--),数组变为:

下标

0

1

2

3

4

5

6

7

8

9

5

7

2

1

9

4

3

10

7

8

从j开始往前找一个小于或等于X的数,

当j=6时,Array[1]= Array[6](i++),数组变为:

下标

0

1

2

3

4

5

6

7

8

9

5

3

2

1

9

4

3

10

7

8

从i开始往后找一个大于X的数,

当i=4时,Array[6]= Array[4] (j--),数组变为:

下标

0

1

2

3

4

5

6

7

8

9

5

3

2

1

9

4

9

10

7

8

从j开始往前找一个小于或等于X的数,

当j=5时,Array[4]= Array [5] (i++),数组变为:

下标

0

1

2

3

4

5

6

7

8

9

5

3

2

1

4

4

9

10

7

8

当i==j==5时,停止循环,将基准数填入,Array[5]=X,数组变为:

下标

0

1

2

3

4

5

6

7

8

9

5

3

2

1

4

6

9

10

7

8

此次循环结束后,可以看出,Array[5]左边的数据都比它小,右边的数都比它大,因此再对Array [0…4] 和Array [6…9]重复上述步骤即可(递归调用)。

C#代码实现:

复制代码
 1  static void Main(string[] args)
 2 {
 3      int[] array = new[] {6, 7, 2, 1, 9, 4, 3, 10, 5, 8};
 4      Sort(array, 0, array.Length - 1);
 5      foreach (int item in array)
 6      {
 7          Console.Write(item + " ");
 8       }
 9         Console.ReadLine();
10   }
复制代码
复制代码
      /// <summary>
        /// 排序
        /// </summary>
        /// <param name="array">要排序的数组</param>
        /// <param name="low">下标开始位置,向右查找</param>
        /// <param name="high">下标开始位置,向左查找</param>
        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);
    }

      /// <summary>
        /// 单元排序
        /// </summary>
        /// <param name="array">要排序的数组</param>
        /// <param name="low">下标开始位置,向右查找</param>
        /// <param name="high">下标开始位置,向右查找</param>
        /// <returns>每次单元排序的停止下标</returns>
        public static int SortUnit(int[] array, int low, int high)
        {
            int key = array[low];//基准数
            while (low < high)
            {
                //从high往前找小于或等于key的值
                while (low < high && array[high] > key)
                    high--;
                //比key小开等的放左边
                array[low] = array[high];
                //从low往后找大于key的值
                while (low < high && array[low] <= key)
                    low++;
                //比key大的放右边
                array[high] = array[low];
           }
            //结束循环时,此时low等于high,左边都小于或等于key,右边都大于key。将key放在游标当前位置。 
            array[low] = key;
            return high;
        }
复制代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值