zoukankan      html  css  js  c++  java
  • 算法:快速排序(Quick Sort)

    算法定义

    目前学习是五种排序(冒泡、插入、选择、合并、快速)中,快速排序是最让我喜欢的算法(因为我想不到),其定义如下:

    • 随机的从数组中选择一个元素,如:item。
    • 对数组进行分区,将小于等于 item 的元素移动到 item 左边,将大于 item 的元素移动到 右边,移动过程 item 的位置也有可能发生变化的。
    • 分区后 item 的位置为 ItemIndex,递归的对 0 至 ItemIndex -1 和 ItemIndex + 1 至 length -1 部分执行递归。

    算法举例

    【5,4,3,2,1】

    【5,43,2,1】

    4,5,3,2,1】

    1,5,3,2,4

    【1,4,3,2,5

    【1,2,3,4,5】

    算法实现

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Threading.Tasks;
     6 
     7 namespace DataStuctureStudy.Sorts
     8 {
     9     class QuickSort<T>
    10         where T : IComparable<T>
    11     {
    12         private static Random _random = new Random();
    13 
    14         private static void Swap(T[] items, int left, int right)
    15         {
    16             if (left != right)
    17             {
    18                 var temp = items[left];
    19                 items[left] = items[right];
    20                 items[right] = temp;
    21             }
    22         }
    23 
    24         public static void Sort(T[] items)
    25         {
    26             if (items.Length < 2)
    27             {
    28                 return;
    29             }
    30 
    31             Sort(items, 0, items.Length - 1);
    32         }
    33 
    34         private static void Sort(T[] items, int left, int right)
    35         {
    36             if (left >= right)
    37             {
    38                 return;
    39             }
    40 
    41             var pivotIndex = _random.Next(left, right);
    42             var newPivotIndex = Partition(items, left, right, pivotIndex);
    43 
    44             Sort(items, left, pivotIndex - 1);
    45             Sort(items, pivotIndex + 1, right);
    46         }
    47 
    48         private static object Partition(T[] items, int left, int right, int pivotIndex)
    49         {
    50             T pivotValue = items[pivotIndex];
    51 
    52             Swap(items, pivotIndex, right);
    53             var newPivotValue = right;
    54 
    55             for (var i = left; i < right; i++)
    56             {
    57                 if (items[i].CompareTo(pivotValue) > 0)
    58                 {
    59                     Swap(items, i, newPivotValue);
    60                     newPivotValue = i;
    61                 }
    62             }
    63 
    64             return newPivotValue;
    65         }
    66     }
    67 }
  • 相关阅读:
    c++好习惯
    mysql:表
    负载均衡
    KBEngine:架构
    skynet的一些运维数据
    Linux学习—LVM快照功能
    跳跃表
    SQL --Chater03 聚合与排序
    SQL --Chapter02 查询基础
    SQL---Chapter01 数据库和SQL
  • 原文地址:https://www.cnblogs.com/happyframework/p/3464682.html
Copyright © 2011-2022 走看看