• 排序及查找----[(冒泡,快速)(拉格朗日,二分)]


    代码展示:

      1 using System;
      2 using System.Collections.Generic;
      3 using System.Linq;
      4 using System.Text;
      5 using System.Threading.Tasks;
      6 
      7 namespace paixu
      8 {
      9     class Program
     10     {
     11         static void Main()
     12         {
     13             int[] Array = { 1, 45, 8, 65, 478, 5, 56, 1, 0, -87, 878, 4, 64 };
     14 
     15             MaoPao(Array);
     16              Console.WriteLine("-----------冒泡--------------------------");
     17             KuaiSu01(Array);
     18              Console.WriteLine("-----------快速法(一)-------------------");            
     19              KuaiSu02(Array);
     20              Console.WriteLine("-----------快速法(二)-------------------");
     21             
     22 string x = "=========以下两种查找方法必须要有序数组=============";
     23 
     24              LaGeLangRi(Array, 878);
     25              Console.WriteLine("-----------拉格朗日插值查找法-----------");           
     26             Dichotomy(Array,0);
     27              Console.WriteLine("-----------二分法查找法-----------------");
     28             
     29              Console.Read();
     30         }
     31 //---------------------冒泡------------------------------------------------
     32         public static void MaoPao( int [] array) 
     33         {
     34             int temp = 0;
     35             for (int i = 0; i < array.Length-1; i++)
     36             {
     37                 for (int j = 0; j < array.Length - 1 - i; j++)
     38                 {
     39                     if (array[j] > array[j + 1])
     40                     {
     41                         temp = array[j];
     42                         array[j] = array[j + 1];
     43                         array[j + 1] = temp;                    
     44                     }               
     45                 }
     46             }
     47             foreach (int  item in array)
     48             {
     49                 Console.WriteLine(item);
     50             }
     51         }
     52 //---------------------快速(法一)------------------------------------------------------
     53         public static void KuaiSu01( int [] array)
     54         {
     55             List <int> list = array.ToList();
     56             QuickSort(list, 0, array.Length - 1);
     57             foreach (int  i in list)
     58             {
     59                 Console.WriteLine(i.ToString());
     60             }
     61         }
     62         private static int Division(List<int> list, int left, int right)//获取按枢轴值左右分流后枢轴的位置
     63         {
     64             while (left < right)
     65             {
     66                 int num = list[left]; //将首元素作为枢轴
     67                 if (num > list[left + 1])
     68                 {
     69                     list[left] = list[left + 1];
     70                     list[left + 1] = num;
     71                     left++;
     72                 }
     73                 else
     74                 {
     75                     int temp = list[right];
     76                     list[right] = list[left + 1];
     77                     list[left + 1] = temp;
     78                     right--;
     79                 }  
     80             }
     81             return left; //指向的此时枢轴的位置
     82         }
     83         private static void QuickSort(List<int> list, int left, int right)//递归进行操作
     84         {
     85             if (left < right)
     86             {
     87                 int i = Division(list, left, right);
     88                 //对枢轴的左边部分进行排序
     89                 QuickSort(list, i + 1, right);
     90                 //对枢轴的右边部分进行排序
     91                 QuickSort(list, left, i - 1);
     92             }
     93         }
     94 //---------------------快速(法二)-------------------------------------------------------
     95         public static void KuaiSu02(int[] array)
     96         {
     97           
     98             Sort(array, 0, array.Length);
     99             foreach (int i in array)
    100             {
    101                 Console.WriteLine(i.ToString());
    102             }
    103         }
    104        public static void Sort(int[] nums, int left, int right)//数组,起始下标,数组长度
    105         {
    106             if (left < right)    //直到排序的左右区间只剩一个值
    107             {
    108                 int i = left;
    109                 int j = right - 1;
    110                 int middle = nums[(left + right) / 2];
    111                 while (true)
    112                 {
    113                     while (i < right && nums[i] < middle) { i++; }; 
    114                        //在middle左边找到一个比middle小的值
    115                     while (j > 0 && nums[j] > middle) { j--; };   
    116                           //在middle右边找到一个比middle大的值
    117                     if (i == j) {break; } 
    118                //当i=j时,middle左边都是比middle小的数,右边都是比middle大的;跳出循环
    119                     nums[i] = nums[i] + nums[j];
    120                     nums[j] = nums[i] - nums[j];
    121                     nums[i] = nums[i] - nums[j];     //两个值交换位置
    122                     if (nums[i] == nums[j]) { j--; }
    123                        //如果两个值相等,且等于middle,为避免进入死循环,j--
    124                 }
    125                 Sort(nums, left, i);           //递归 
    126                 Sort(nums, i + 1, right);
    127             }
    128         }
    129 
    130        //--------拉格朗日插值查找法(相同元素返回第一个元素下标)-----------------         
    131        public static int LaGeLangRi(int[] a, int key)
    132         {
    133              int tou=0;
    134             int wei=a.Length-1;
    135             int  zhong =0;
    136             while(tou<=wei)
    137             {
    138                 zhong = tou + (wei - tou) * (key - a[tou]) / (a[wei] - a[tou]);
    139                 if (key == a[zhong]) { break; }
    140                 else if (key > a[zhong]) { tou = zhong + 1; }
    141                 else{wei=zhong-1;}
    142             }
    143             Console.Write(key); Console.WriteLine("---->对应的下标是:" + zhong);           
    144             return zhong;
    145             
    146         }
    147 //-------------------二分查找法(相同元素返回第一个元素下标)------------------------
    148        public static void Dichotomy(int[] array,int item)
    149        {          
    150            int x = BinarySearch(array, 0, array.Length - 1, item);
    151            Console.Write(item); Console.WriteLine("---->对应的下标是:" + x);                
    152        } 
    153         public  static int BinarySearch(int[] arr, int low, int high, int key)
    154         {
    155             int mid = (low + high) / 2;
    156             if (low > high){return -1;}               
    157             else
    158             {
    159                 if (arr[mid] == key){ return mid;}                   
    160                 else if (arr[mid] > key){return BinarySearch(arr, low, mid - 1, key);}                    
    161                 else{return BinarySearch(arr, mid + 1, high, key);}                    
    162             }
    163             
    164         }
    165     }
    166 }

    备注:

    排序的话,快速排序效率是较高的.

  • 相关阅读:
    轻重搭配
    EF的优缺点
    使用bootstrap-select有时显示“Nothing selected”
    IIS发布 HTTP 错误 500.21
    js添加的元素无法触发click事件
    sql server查看表是否死锁
    sql server把一个库表的某个字段更新到另一张表的相同字段
    SQLSERVER排查CPU占用高的情况
    SQL server中如何按照某一字段中的分割符将记录拆成多条
    LINQ to Entities does not recognize the method 'System.DateTime AddDays(Double)' method, and this method cannot be translated into a store expression.
  • 原文地址:https://www.cnblogs.com/Future-Better/p/9887524.html
Copyright © 2020-2023  润新知