• 常见排序算法的实现和比较


      1     class Program
      2     {
      3 
      4         static void Main(string[] args)
      5         {
      6             int[] arr = new int[] { 2, 4, 1, 7, 4, 9, 6, 0, 1, 5, 8, 3 };
      7             List<int> list = MergeSort(arr.ToList<int>());
      8 
      9             foreach (int num in list)
     10                 Console.WriteLine(num);
     11         }
     12 
     13 
     14         /// <summary>
     15         /// 7.
     16         /// 堆排序
     17         /// 不稳定
     18         /// nlogn
     19         /// </summary>
     20         public static void HeapSort(int[] arr)
     21         {
     22             if (arr == null || arr.Length < 1)
     23                 return;
     24 
     25             //构建堆
     26             for (int i = arr.Length / 2; i >= 0; i--)
     27             {
     28                 AdjustHeap(arr, i, arr.Length);
     29             }
     30 
     31             //堆排序
     32             for (int i = arr.Length - 1; i > 0; i--)
     33             {
     34                 Swap(arr, 0, i);
     35                 AdjustHeap(arr, 0,i);
     36             }
     37         }
     38 
     39         /// <summary>
     40         /// 调整大根堆
     41         /// </summary>
     42         public static void AdjustHeap(int[] arr,int index,int len)
     43         {
     44             int left = index * 2 + 1;
     45             int right = index * 2 + 2;
     46             int large = index;
     47 
     48             if(left< len && arr[left]>arr[large])
     49                 large = left;
     50 
     51             if (right < len && arr[right] > arr[large])
     52                 large = right;
     53 
     54             if (large != index)
     55             {
     56                 Swap(arr, large, index);
     57                 AdjustHeap(arr, large, len);
     58             }
     59         }
     60 
     61         /// <summary>
     62         /// 6.
     63         /// 归并排序
     64         /// 稳定
     65         /// nlogn
     66         /// </summary>
     67         public static List<int> MergeSort(List<int> list)
     68         {
     69             if (list == null || list.Count <= 1)
     70                 return list;
     71 
     72             List<int> left = new List<int>();
     73             List<int> right = new List<int>();
     74 
     75             int mid = list.Count / 2;
     76 
     77             for (int i = 0; i < mid; i++)
     78                 left.Add(list[i]);
     79 
     80             for (int i = mid; i < list.Count; i++)
     81                 right.Add(list[i]);
     82 
     83             left = MergeSort(left);
     84             right = MergeSort(right);
     85 
     86             return Merge(left, right);
     87         }
     88 
     89         public static List<int> Merge(List<int> left,List<int> right)
     90         {
     91             int lenL = left.Count;
     92             int lenR = right.Count;
     93             List<int> rs = new List<int>();
     94 
     95             while (left.Count > 0 && right.Count > 0)
     96             {
     97                 if (left[0] < right[0])
     98                 {
     99                     rs.Add(left[0]);
    100                     left.RemoveAt(0);
    101                 }
    102                 else
    103                 {
    104                     rs.Add(right[0]);
    105                     right.RemoveAt(0);
    106                 }
    107             }
    108 
    109             rs.AddRange(right.Count > 0 ? right : left);
    110 
    111             return rs;
    112         }
    113 
    114         /// <summary>
    115         /// 5.
    116         /// 希尔排序
    117         /// 不稳定
    118         /// nlogn
    119         /// </summary>
    120         public static void ShellSort(int[] arr)
    121         {
    122             if (arr == null || arr.Length < 1)
    123                 return;
    124 
    125             int gap = arr.Length / 2;
    126 
    127             for (; gap > 0; gap /= 2)
    128             {
    129                 for (int i = gap; i < arr.Length; i++)
    130                 {
    131                     int j = i;
    132                     int temp = arr[i];
    133 
    134                     while (j-gap >= 0 && arr[j - gap] > temp)
    135                     {
    136                         arr[j] = arr[j - gap];
    137                         j -= gap;
    138                     }
    139 
    140                     arr[j] = temp;
    141                 }
    142             }
    143         }
    144 
    145         /// <summary>
    146         /// 4.
    147         /// 快速排序
    148         /// 不稳定
    149         /// nlogn
    150         /// </summary>
    151         public static void QuickSort(int[] arr,int start,int end)
    152         {
    153             if (arr == null || arr.Length < 1 || start>=end)
    154                 return;
    155 
    156             int mid = Partition(arr, start, end);
    157 
    158             QuickSort(arr, start, mid - 1);
    159             QuickSort(arr, mid + 1, end);
    160         }
    161 
    162         /// <summary>
    163         /// Partition方法
    164         /// </summary>
    165         public static int Partition(int[] arr, int start, int end)
    166         {
    167             int key = arr[start];
    168 
    169             while (start < end)
    170             {
    171                 while (start < end && arr[end] >= key)
    172                     end--;
    173                 arr[start] = arr[end];
    174 
    175                 while (start < end && arr[start] <= key)
    176                     start++;
    177                 arr[end] = arr[start];
    178             }
    179 
    180             arr[start] = key;
    181 
    182             return start;
    183         }
    184 
    185         /// <summary>
    186         /// 3.
    187         /// 选择排序
    188         /// 不稳定
    189         /// n^2
    190         /// </summary>
    191         public static void SelectionSort(int[] arr)
    192         {
    193             if (arr == null || arr.Length < 1)
    194                 return;
    195 
    196             for (int i = 0; i < arr.Length - 1; i++)
    197             {
    198                 int maxIndex = i;
    199 
    200                 for (int j = i + 1; j < arr.Length; j++)
    201                 {
    202                     maxIndex = arr[j] < arr[maxIndex] ? j : maxIndex;
    203                 }
    204 
    205                 Swap(arr, i, maxIndex);
    206             }
    207         }
    208 
    209         /// <summary>
    210         /// 2.
    211         /// 插入排序
    212         /// 稳定
    213         /// n^2
    214         /// </summary>
    215         public static void InsertSort(int[] arr)
    216         {
    217             if (arr == null || arr.Length < 1)
    218                 return;
    219 
    220             for (int i = 1; i < arr.Length; i++)
    221             {
    222                 for (int j = i - 1; j >= 0; j--)
    223                 {
    224                     if (arr[j] > arr[j + 1])
    225                         Swap(arr, j, j + 1);
    226                     else
    227                         break;
    228                 }
    229             }
    230         }
    231 
    232         /// <summary>
    233         /// 1.
    234         /// 冒泡排序
    235         /// 稳定
    236         /// n^2
    237         /// </summary>
    238         public static void BubbleSort(int[] arr)
    239         {
    240             if (arr == null || arr.Length < 1)
    241                 return;
    242 
    243             for (int i = 0; i < arr.Length; i++)
    244             {
    245                 bool flag = true;
    246 
    247                 for (int j = 0; j < arr.Length - i - 1; j++)
    248                 {
    249                     if (arr[j] > arr[j + 1])
    250                     {
    251                         flag = false;
    252                         Swap(arr, j, j + 1);
    253                     }
    254                 }
    255 
    256                 if (flag) return;
    257             }
    258         }
    259 
    260         /// <summary>
    261         /// 交换数组中的两个数
    262         /// </summary>
    263         public static void Swap(int[] arr, int indexA, int indexB)
    264         {
    265             int temp = arr[indexA];
    266             arr[indexA] = arr[indexB];
    267             arr[indexB] = temp;
    268         }
    269     }
  • 相关阅读:
    php基本文件操作````
    PHP+JS无限级可伸缩菜单详解(递归方法)
    php 服务器快速搭建
    PHP编码转换函数
    php生成html分页方法-----ob篇
    gcc
    虚拟地址_物理地址_逻辑地址_页表_内存映射
    GCC动态库和静态库混合使用
    Linux下GCC生成和使用静态库和动态库详解(二)
    Linux下GCC生成和使用静态库和动态库详解(一)
  • 原文地址:https://www.cnblogs.com/HuoAA/p/4826403.html
Copyright © 2020-2023  润新知