如何在C#中用switch或if语句根据用户选择调用排序算法
解决排序算法选择的实现问题
首先,我们需要把三种排序算法封装成独立的静态方法,这些方法接收int[]类型的参数(数组是引用类型,方法内的修改会直接作用于原数组)。之后根据用户输入的选项,用switch或if语句判断并调用对应的排序方法,最后输出排序后的结果。
第一步:实现排序算法方法
在Program类中添加以下三个静态方法:
// 堆排序实现 static void HeapSort(int[] arr) { int n = arr.Length; // 构建最大堆 for (int i = n / 2 - 1; i >= 0; i--) Heapify(arr, n, i); // 逐个取出堆顶元素并调整堆结构 for (int i = n - 1; i > 0; i--) { // 将堆顶元素移到数组末尾 int temp = arr[0]; arr[0] = arr[i]; arr[i] = temp; // 对剩余元素重新堆化 Heapify(arr, i, 0); } } static void Heapify(int[] arr, int n, int i) { int largest = i; // 初始化最大元素为根节点 int left = 2 * i + 1; // 左子节点索引 int right = 2 * i + 2; // 右子节点索引 // 如果左子节点大于根节点,更新最大元素索引 if (left < n && arr[left] > arr[largest]) largest = left; // 如果右子节点大于当前最大元素,更新最大元素索引 if (right < n && arr[right] > arr[largest]) largest = right; // 如果最大元素不是根节点,交换并递归堆化受影响的子树 if (largest != i) { int swap = arr[i]; arr[i] = arr[largest]; arr[largest] = swap; Heapify(arr, n, largest); } } // 冒泡排序实现 static void BubbleSort(int[] arr) { int n = arr.Length; for (int i = 0; i < n - 1; i++) for (int j = 0; j < n - i - 1; j++) if (arr[j] > arr[j + 1]) { // 交换相邻元素 int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } // 希尔排序实现 static void ShellSort(int[] arr) { int n = arr.Length; // 初始步长设为数组长度的一半,逐步减半 for (int gap = n / 2; gap > 0; gap /= 2) { // 对每个步长区间执行插入排序 for (int i = gap; i < n; i++) { int temp = arr[i]; int j; // 向前比较并移动元素,找到当前元素的正确位置 for (j = i; j >= gap && arr[j - gap] > temp; j -= gap) arr[j] = arr[j - gap]; arr[j] = temp; } } }
第二步:根据用户选择调用排序方法
你可以选择以下两种方式实现判断逻辑,替换原代码中...的位置:
方式一:使用switch语句
// 根据用户输入的选项调用对应排序方法 switch (myOption) { case "1": HeapSort(arr); Console.WriteLine("堆排序执行完成"); break; case "2": BubbleSort(arr); Console.WriteLine("冒泡排序执行完成"); break; case "3": ShellSort(arr); Console.WriteLine("希尔排序执行完成"); break; default: Console.WriteLine("输入选项无效,请输入1、2或3"); return; // 直接返回,不执行后续输出逻辑 } // 输出排序后的数组 Console.Write("\n排序后的数组为: "); for (i = 0; i < 10; i++) { Console.Write("{0} ", arr[i]); } Console.Write("\n"); Console.ReadLine(); // 让窗口停留,方便查看结果
方式二:使用if-else语句
// 根据用户输入的选项调用对应排序方法 if (myOption == "1") { HeapSort(arr); Console.WriteLine("堆排序执行完成"); } else if (myOption == "2") { BubbleSort(arr); Console.WriteLine("冒泡排序执行完成"); } else if (myOption == "3") { ShellSort(arr); Console.WriteLine("希尔排序执行完成"); } else { Console.WriteLine("输入选项无效,请输入1、2或3"); return; // 直接返回,不执行后续输出逻辑 } // 输出排序后的数组 Console.Write("\n排序后的数组为: "); for (i = 0; i < 10; i++) { Console.Write("{0} ", arr[i]); } Console.Write("\n"); Console.ReadLine(); // 让窗口停留,方便查看结果
完整代码示例
整合上述代码后,完整的Program类如下:
using System; namespace ASortAboveTheRest { internal class Program { static void Main(string[] args) { MainMenu(); } static void MainMenu() { Console.Clear(); Console.WriteLine("Choose a sort algorithm to perform on the Array"); Console.WriteLine(""); Console.WriteLine("Option 1: Heap Sort"); Console.WriteLine("Option 2: Bubble Sort"); Console.WriteLine("Option 3: Shell Sort"); Console.WriteLine("Please type: 1, 2, or 3"); string myOption; myOption = Console.ReadLine(); int[] arr = new int[10]; int i; Console.Write("Input 10 elements in the array :\n"); for (i = 0; i < 10; i++) { Console.Write("element - {0} : ", i); arr[i] = Convert.ToInt32(Console.ReadLine()); } Console.Write("\nElements in array are: "); for (i = 0; i < 10; i++) { Console.Write("{0} ", arr[i]); } Console.Write("\n"); // 使用switch判断(可替换为if-else版本) switch (myOption) { case "1": HeapSort(arr); Console.WriteLine("堆排序执行完成"); break; case "2": BubbleSort(arr); Console.WriteLine("冒泡排序执行完成"); break; case "3": ShellSort(arr); Console.WriteLine("希尔排序执行完成"); break; default: Console.WriteLine("输入选项无效,请输入1、2或3"); return; } // 输出排序结果 Console.Write("\n排序后的数组为: "); for (i = 0; i < 10; i++) { Console.Write("{0} ", arr[i]); } Console.Write("\n"); Console.ReadLine(); } static void HeapSort(int[] arr) { int n = arr.Length; for (int i = n / 2 - 1; i >= 0; i--) Heapify(arr, n, i); for (int i = n - 1; i > 0; i--) { int temp = arr[0]; arr[0] = arr[i]; arr[i] = temp; Heapify(arr, i, 0); } } static void Heapify(int[] arr, int n, int i) { int largest = i; int left = 2 * i + 1; int right = 2 * i + 2; if (left < n && arr[left] > arr[largest]) largest = left; if (right < n && arr[right] > arr[largest]) largest = right; if (largest != i) { int swap = arr[i]; arr[i] = arr[largest]; arr[largest] = swap; Heapify(arr, n, largest); } } static void BubbleSort(int[] arr) { int n = arr.Length; for (int i = 0; i < n - 1; i++) for (int j = 0; j < n - i - 1; j++) if (arr[j] > arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } static void ShellSort(int[] arr) { int n = arr.Length; for (int gap = n / 2; gap > 0; gap /= 2) { for (int i = gap; i < n; i++) { int temp = arr[i]; int j; for (j = i; j >= gap && arr[j - gap] > temp; j -= gap) arr[j] = arr[j - gap]; arr[j] = temp; } } } } }
内容的提问来源于stack exchange,提问作者Thatguy
相关产品推荐
相关产品推荐

