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;  //把原先保存好临时数值放回这个数组的空地方,  保证数组的完整性
            }
        }

 

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

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

posted @ 2018-10-12 16:21  幸运(● ̄(エ) ̄●)  阅读(712)  评论(0编辑  收藏  举报
Document