【C#实现各类排序算法】

//把一些自己现在能够实现的排序算法合并一下,做一个记录和积累吧!using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace Lib{ public class Sort { /// /// 插入递增排序 /// /// 排序前数组 /// 排序后数组 public int[] Insert(int[] unsortarray) { int[] insertResult = new int[unsortarray.Length]; insertResult[0] = unsortarray[0]; for (int i = 1; i < insertResult.Length; i++) { int key = unsortarray[i]; int j = i - 1; while (j >= 0 && insertResult[j] > unsortarray[i]) { insertResult[j + 1] = insertResult[j]; j = j - 1; } insertResult[j + 1] = key; } return insertResult; } /// /// 选择递增排序 /// /// 排序前数组 /// 排序后数组 public int[] Selection(int[] sortarray) { int loopLimits = 0; int temp; while (loopLimits < sortarray.Length) { for (int i = loopLimits + 1; i < sortarray.Length; i++) { if (sortarray[i] < sortarray[loopLimits]) { temp = sortarray[loopLimits]; sortarray[loopLimits] = sortarray[i]; sortarray[i] = temp; } } loopLimits++; } return sortarray; } /// /// 冒泡递增排序 /// /// 排序前数组 /// 排序后数组 public int[] Bubble(int[] sortarray) { for (int i = 0; i < sortarray.Length; i++)//每轮比较后增1,减少后面比较的个数 { for (int j = 0; j < sortarray.Length - 1 - i; j++) //每次比较相邻两个数字,较大者排后 { if (sortarray[j] > sortarray[j + 1]) { int temp = sortarray[j]; sortarray[j] = sortarray[j + 1]; sortarray[j + 1] = temp; } } } return sortarray; } /// /// 快速递增排序 /// /// 排序前数组 /// 数组头 /// 数组尾 /// public int[] Quick(int[] array, int p, int r) { if (p < r) { int q = Partition(array, p, r); Quick(array, p, q - 1); Quick(array, q + 1, r); } return array; } /// /// 快速排序辅助函数 /// /// 数组 /// 数组头 /// 数组尾 /// public int Partition(int[] array, int p, int r) { int x = array[r]; int i = p - 1; int temp = 0; for (int j = p; j < r; j++) { if (array[j] < x) { i++; temp = array[j]; array[j] = array[i]; array[i] = temp; } } temp = array[i + 1]; array[i + 1] = array[r]; array[r] = temp; return i + 1; } /// /// 计数递增排序,适用于 /// /// 排序前数组 /// 排序后数组 public int[] Counting(int[] array) { int maxvalue = array[0]; //最多n-1次遍历找到最大值 for (int i = 1; i < array.Length; i++) { if (array[i] > maxvalue) { maxvalue = array[i]; } } //声明一个长度为最大值+1的数组 int[] newarray = new int[maxvalue+1]; //遍历该新数组,赋值为0 for (int i = 0; i < newarray.Length; i++) { newarray[i] = 0; } //遍历排序前数组,计算每一个值出现的次数,存入暂存数组中 for (int i = 0; i < array.Length; i++) { newarray[array[i]]++; } //遍历暂存数组,计算每一个元素前最多有几个元素,方便后面排序时知道数据的正确位置 for (int i = 1; i < newarray.Length; i++) { newarray[i] = newarray[i] + newarray[i - 1]; } //声明一个长度与排序数组长度一样的数组,用来存放排序后的数组 int[] resultarray = new int[array.Length]; //遍历数组,进行安放数据,同时每次将暂存数组对应的值自减一 for (int i = 0; i < resultarray.Length; i++) { resultarray[newarray[array[i]]-1] = array[i]; newarray[array[i]]--; } return resultarray; } }}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是C#实现的几种常见排序算法示例: 1. 冒泡排序 ```csharp static void BubbleSort(int[] arr) { int len = arr.Length; for (int i = 0; i < len - 1; i++) { for (int j = 0; j < len - i - 1; j++) { if (arr[j] > arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } ``` 2. 选择排序 ```csharp static void SelectionSort(int[] arr) { int len = arr.Length; for (int i = 0; i < len - 1; i++) { int minIndex = i; for (int j = i + 1; j < len; j++) { if (arr[j] < arr[minIndex]) { minIndex = j; } } if (minIndex != i) { int temp = arr[i]; arr[i] = arr[minIndex]; arr[minIndex] = temp; } } } ``` 3. 插入排序 ```csharp static void InsertionSort(int[] arr) { int len = arr.Length; for (int i = 1; i < len; i++) { int temp = arr[i]; int j = i - 1; while (j >= 0 && arr[j] > temp) { arr[j + 1] = arr[j]; j--; } arr[j + 1] = temp; } } ``` 4. 快速排序 ```csharp static void QuickSort(int[] arr, int left, int right) { if (left < right) { int pivot = Partition(arr, left, right); QuickSort(arr, left, pivot - 1); QuickSort(arr, pivot + 1, right); } } static int Partition(int[] arr, int left, int right) { int pivot = arr[right]; int i = left - 1; for (int j = left; j < right; j++) { if (arr[j] < pivot) { i++; int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } int temp2 = arr[i + 1]; arr[i + 1] = arr[right]; arr[right] = temp2; return i + 1; } ``` 5. 归并排序 ```csharp static void MergeSort(int[] arr, int left, int right) { if (left < right) { int mid = (left + right) / 2; MergeSort(arr, left, mid); MergeSort(arr, mid + 1, right); Merge(arr, left, mid, right); } } static void Merge(int[] arr, int left, int mid, int right) { int[] temp = new int[right - left + 1]; int i = left; int j = mid + 1; int k = 0; while (i <= mid && j <= right) { if (arr[i] < arr[j]) { temp[k++] = arr[i++]; } else { temp[k++] = arr[j++]; } } while (i <= mid) { temp[k++] = arr[i++]; } while (j <= right) { temp[k++] = arr[j++]; } for (int m = 0; m < temp.Length; m++) { arr[left + m] = temp[m]; } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值