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; //把原先保存好临时数值放回这个数组的空地方, 保证数组的完整性 } }
站在巨人的肩膀上真的会看的更远更清晰!
-----用志不分,乃凝于神