C# 快速(二分法)排序

2 篇文章 0 订阅

快速(二分法)排序的思想是将数组划分为两边,以某个节点v为界(设这个节点的值为 v),在节点v左边的所有元素都小于 v, 在节点v右边的所有元素都大于v.

这样不停地划分,到最后整个数组就是有序的了。

 

具体分成两边的思路为(起始下标为start, 结束下标为 end):

选择v = a[end]作为中介点

先从start开始扫描,遇到a[++i] < v停下来,接着从end开始扫描a[--j] > v停下来,交换a[i]和a[j]

接着从i+1开始扫描,另一边接着从j-1开始扫描。注意边界条件if (i >= j) break; 扫描完成后就找到了v应该放得位置,交换Swap(ref a[i], ref a[end]);这样就完成了一次划分。

该算法的平均时间复杂度为nLgn,最坏的情况是n的平方。该算法适合使用于大数据量的排序:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace QuickSort
{
    class Program
    {
        static void Main(string[] args)
        {
          
            int[] a ={1,6,4,3,8,5,21,9,31,81,101,55,62, 151, 7,2,10};

            quicksort(a, 0, a.Length-1);

            for (int i = 0; i < a.Length; i++)
            {
                Console.WriteLine(a[i]);
            }

            Console.Read();
        }

        static void quicksort(int[] a, int start, int end)
        {
            int i;
            if (end - start == 1)
            {
                if (a[start] > a[end])
                {
                    Swap(ref a[start], ref a[end]);
                }

                return;
            }
                
            if (end - start == 0)
            {               
                return;
            }

            i = partition(a, start, end);
            if (i > start)
            {
                quicksort(a, start, i - 1);
            }

            if (i < end)
            {
                quicksort(a, i + 1, end);
            }
        }

        static int partition(int[] a, int start, int end)
        {
          int i = start-1;
          int j = end;
          int v = a[end];
          for (; ; )
            {
                while (i < end && a[++i] < v) ;
                while (j > start && a[--j] > v) ;            
                if (i > = j) break;
                Swap(ref a[i], ref a[j]);
            }

          Swap(ref a[i], ref a[end]);
          return i;
        }

        static void Swap(ref int a, ref int b)
        {
            int temp = a;
            a = b;
            b = temp;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值