zoukankan      html  css  js  c++  java
  • c#常用的排序算法

    //快速排序递归算法

     1   static void Main(string[] args)
     2         {
     3             int[] arr = { 24,3,5,65,9};
     4             Sort(arr);
     5             for (int i = 0; i < arr.Length;i++ ) {
     6                 Console.WriteLine(arr[i]);
     7             }
     8             Console.ReadKey();
     9         }
    10         /// <summary>
    11         /// 快速排序
    12         /// </summary>
    13         /// <param name="numbers"></param>
    14         public static void Sort(int[] numbers)
    15         {
    16             QuickSort(numbers, 0, numbers.Length - 1);
    17         }
    18         /// <summary>
    19         /// 快速排序主要逻辑
    20         /// </summary>
    21         /// <param name="numbers">排序所需的数组</param>
    22         /// <param name="left">数组的起始下标</param>
    23         /// <param name="right">数组的末尾下标</param>
    24         private static void QuickSort(int[] numbers, int left, int right)
    25         {
    26             if (left < right)
    27             {
    28                 int middle = numbers[(left + right) / 2];//找到中间值
    29                 int i = left - 1;
    30                 int j = right + 1;
    31                 while (true)
    32                 {
    33                     while (numbers[++i] < middle) ;//判断左边数组数据与中间数组大小
    34                     while (numbers[--j] > middle) ;//判断右边数据与中间数组大小
    35                     if (i >= j)
    36                         break;
    37                     Swap(numbers, i, j);//交换位置
    38                 }
    39                 QuickSort(numbers, left, i - 1);//使用递归左排序
    40                 QuickSort(numbers, j + 1, right);//使用递归右排序
    41             }
    42         }
    43         /// <summary>
    44         /// 对应下标数据交换位置
    45         /// </summary>
    46         /// <param name="numbers">排序数组</param>
    47         /// <param name="i">数组下标</param>
    48         /// <param name="j">数组下标</param>
    49         private static void Swap(int[] numbers, int i, int j)
    50         {
    51             int number = numbers[i];
    52             numbers[i] = numbers[j];
    53             numbers[j] = number;
    54         }

    //插入排序

            static void Main(string[] args)
            {
                int[] arr = { 24, 3, 5, 65, 9 };
                InsertSort(arr);
                for (int i = 0; i < arr.Length;i++ ) {
                  Console.WriteLine(arr[i]);
                }
                Console.ReadKey();
            }
            /// <summary>
            /// 插入排序
            /// </summary>
            /// <param name="arr">需要排序的数组</param>
             private static void InsertSort(int[] arr)
            {
                int j = 0;//定义一个随机变化的下标
                for (int i = 1; i < arr.Length; i++)
                {
                    int temp=arr[i];//取出数组的一组数据
                    j=i-1;
                    while (j >= 0 && temp < arr[j])//同时满足俩个条件执行
                    {
                        arr[j + 1] = arr[j];//条件符合插入数据,反复执行直到超出索引范围
                        j--;
                    }
                    arr[j + 1] = temp;//将取出的数据放在最后一次调换数据的位置
                }
            }

    //二分法查找算法

     1         static void Main(string[] args)
     2         {
     3             int[] arr = { 2, 3, 5, 6, 9 };
     4             int index=BinarySearch(arr, 6);
     5             Console.WriteLine(index);
     6             Console.ReadKey();
     7         }
     8         /// <summary>
     9         /// 二分法查找算法(要查找的数组为以排好序的数组)
    10         /// </summary>
    11         /// <param name="arr">以排好序的数组</param>
    12         /// <param name="number">需要查找的数</param>
    13         /// <returns></returns>
    14          private static int BinarySearch(int[] arr, int number)
    15         {
    16             int left = 0;//定义数组的最左端下标
    17             int right = arr.Length - 1;//定义数组最右端下标
    18             while (left < right)//当最左端下标大于右端下表时退出循环
    19             {
    20                 int middle = (left + right) / 2;//获取数组中间值
    21                 if (number == arr[middle])//判断查找的数是否为中间值
    22                 {
    23                     return middle;
    24                 }
    25                 else if (number < arr[middle])
    26                 {
    27                     right = middle-1;//判断查找值是否在中间值的左侧,如果是则将查找的左边下标改为中间值下标前一位
    28                 }
    29                 else
    30                 {
    31                     left = middle+1;//如果不是,则查找的数在中间值右侧,需更改左边下标为中间值后一位
    32                 }
    33             }
    34             return -1;
    35         }

    //选择排序

            static void Main(string[] args)
            {
                int[] arr = { 24, 3, 15, 6, 19 };
                SelectSort(arr);
                for(int i=0;i<arr.Length;i++){
                Console.WriteLine(arr[i]);
                }
                Console.ReadKey();
            }
            /// <summary>
            /// 选择排序
            /// </summary>
            /// <param name="arr">要排序的数组</param>
            private static void SelectSort(int[] arr)
            {
                int temp = 0;
                for (int i = 0; i < arr.Length - 1; i++)
                {
                    int minVal = arr[i]; //假设 i 下标就是最小的数
                    int minIndex = i;  //记录我认为最小的数的下标
    
                    for (int j = i + 1; j < arr.Length; j++)   //这里只是找出这一趟最小的数值并记录下它的下标
                    {
                        //说明我们认为的最小值,不是最小
                        if (minVal > arr[j])    //这里大于号是升序(大于是找出最小值) 小于是降序(小于是找出最大值)
                        {
                            minVal = arr[j];  //更新这趟最小(或最大)的值 (上面要拿这个数来跟后面的数继续做比较)
                            minIndex = j;    //记下它的下标
                        }
                    }
                    //最后把最小的数与第一的位置交换
                    temp = arr[i];    //把第一个原先认为是最小值的数,临时保存起来
                    arr[i] = arr[minIndex];   //把最终我们找到的最小值赋给这一趟的比较的第一个位置
                    arr[minIndex] = temp;  //把原先保存好临时数值放回这个数组的空地方,  保证数组的完整性
                }
            }

    站在巨人的肩膀上真的会看的更远更清晰!

                               -----用志不分,乃凝于神

  • 相关阅读:
    剑指Offer_编程题_包含min函数的栈
    剑指Offer_编程题_顺时针打印矩阵
    Docker基础(3) 数据卷
    Docker基础(2) 实践篇
    Docker基础(1) 原理篇
    《算法》笔记 17
    《算法》笔记 16
    《算法》笔记 15
    《算法》笔记 14
    《算法》笔记 13
  • 原文地址:https://www.cnblogs.com/xiong950413/p/9778827.html
Copyright © 2011-2022 走看看