使用泛型实现对int数组或者String数组进行排序

本文介绍了一种使用泛型实现的排序算法,通过定义Sort类并实现Comparable接口的compareTo方法,适用于不同类型的数据排序,如int和String。具体实现了冒泡排序算法,并通过快速排序方法进行了演示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因为是使用的泛型,我们并不确定数据类型,
对于数据的比较就不能用平时的大于或者小于。
我们需要比较对象实现Comparable接口,该接口下的compareTo()方法可以用来比大小

定义Sort类:

package com.daleyzou.blog;

/**
 * @Author: DaleyZou
 * @Description: 定义进行排序都需要哪些方法
 * @Date: Created in 20:57 2018/10/29
 * @Modified By:
 */
public abstract class Sort<T extends Comparable<T>> {
    public abstract void sort(T[] nums); // 排序的方法

    public int less(T v, T w){ // 比较大小
        return v.compareTo(w);
    }

    public void swap(T[] nums, int i, int j){ // 进行数组值交换
        T temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
}

排序方法使用快速排序:

package com.daleyzou.blog;

import java.util.Arrays;

/**
 * @Author: DaleyZou
 * @Description: 使用泛型实现对int数组或者String数组进行排序
 *                  基于快速排序实现
 * @Date: Created in 21:07 2018/10/29
 * @Modified By:
 */
public class BubbleSort<T extends Comparable<T>> extends Sort<T> {
    @Override
    public void sort(T[] nums) {
        boolean isSorted = false;
        for (int i = 0; i < nums.length; i++){
            isSorted = true;
            for (int j = 1; j < nums.length - i; j++){
                if (nums[j].compareTo(nums[j - 1]) < 0){
                    swap(nums, j, j - 1);
                    isSorted = false;
                }
            }
            if (isSorted){
                break;
            }
        }
    }

    public static void main(String[] args){
        // 验证String类型
        String[] strs = new String[]{"123", "1234", "1"};
        BubbleSort<String> strSort = new BubbleSort<>();
        strSort.sort(strs);
        System.out.println("验证String类型:");
        Arrays.stream(strs).forEach(System.out::println);

        // 验证int类型
        Integer[] ints = new Integer[]{123,1234,1};
        BubbleSort<Integer> intSort = new BubbleSort<>();
        intSort.sort(ints);
        System.out.println("验证int类型");
        Arrays.stream(ints).forEach(System.out::println);
    }
}

转载于:https://www.cnblogs.com/daleyzou/p/9873477.html

<think>我们使用方法来实现冒泡排序,同时要求传入的数组元素类必须实现IComparable接口,这样我们可以比较元素的大小。 如果没有实现IComparable,我们可以通过传入一个比较委托来实现,但这里我们采用接口约束的方式。 步骤: 1. 定义方法,类参数T必须实现IComparable<T>接口(或者的IComparable,但推荐版本)。 2. 在方法内部,使用冒泡排序算法,通过调用CompareTo方法来比较两个元素的大小。 3. 如果当前元素大于下一个元素(即CompareTo方法返回大于0),则交换它们。 注意:我们也可以像引用[2]那样使用委托作为比较方法,但这里我们按照用户要求使用接口约束。 我们提供两种实现方式: 方式一:使用IComparable<T>约束 方式二:使用比较委托(可选,作为扩展思路) 但用户要求是方法,并且要求传入的类必须实现指定接口(即IComparable<T>),所以我们主要实现方式一。 然而,为了灵活性,我们也可以同时提供两种方式,但根据问题,我们重点实现接口约束的方式。 实现如下:</think>以下是使用C#实现冒泡排序的完整方案,通过接口约束确保类可比较: ### 冒泡排序实现 ```csharp using System; using System.Collections.Generic; public class BubbleSorter { // 方法1:使用IComparable<T>接口约束 public static void BubbleSort<T>(T[] array) where T : IComparable<T> { if (array == null) throw new ArgumentNullException(nameof(array)); bool swapped; for (int i = 0; i < array.Length - 1; i++) { swapped = false; for (int j = 0; j < array.Length - i - 1; j++) { // 调用接口的CompareTo方法比较元素 if (array[j].CompareTo(array[j + 1]) > 0) { // 交换元素 (array[j], array[j + 1]) = (array[j + 1], array[j]); swapped = true; } } // 提前终止优化 if (!swapped) break; } } // 方法2:使用委托实现自定义比较(更灵活) public static void BubbleSort<T>(T[] array, Func<T, T, int> comparer) { if (array == null) throw new ArgumentNullException(nameof(array)); if (comparer == null) throw new ArgumentNullException(nameof(comparer)); bool swapped; for (int i = 0; i < array.Length - 1; i++) { swapped = false; for (int j = 0; j < array.Length - i - 1; j++) { // 使用委托比较元素 if (comparer(array[j], array[j + 1]) > 0) { // 交换元素 (array[j], array[j + 1]) = (array[j + 1], array[j]); swapped = true; } } if (!swapped) break; } } } // 使用示例 public class Person : IComparable<Person> { public string Name { get; set; } public int Age { get; set; } public int CompareTo(Person other) => Age.CompareTo(other.Age); public override string ToString() => $"{Name} ({Age})"; } class Program { static void Main() { // 示例1:使用IComparable接口排序 var people = new Person[] { new Person { Name = "Alice", Age = 30 }, new Person { Name = "Bob", Age = 25 }, new Person { Name = "Charlie", Age = 28 } }; BubbleSorter.BubbleSort(people); Console.WriteLine("按年龄排序:"); foreach (var p in people) Console.WriteLine(p); // 示例2:使用委托自定义排序 int[] numbers = { 5, 2, 8, 1, 9 }; BubbleSorter.BubbleSort(numbers, (a, b) => a.CompareTo(b)); Console.WriteLine("\n数字排序:"); foreach (var n in numbers) Console.Write(n + " "); // 1 2 5 8 9 // 示例3:降序排序 string[] words = { "banana", "apple", "pear", "orange" }; BubbleSorter.BubbleSort(words, (a, b) => b.CompareTo(a)); // 降序比较 Console.WriteLine("\n字符串降序:"); foreach (var w in words) Console.Write(w + " "); // pear banana apple orange } } ``` ### 关键实现说明 1. **接口约束** 使用 `where T : IComparable<T>` 确保类可比较[^1]: ```csharp public static void BubbleSort<T>(T[] array) where T : IComparable<T> ``` 2. **比较方法** 通过 `CompareTo()` 方法实现元素比较: ```csharp if (array[j].CompareTo(array[j + 1]) > 0) ``` 3. **性能优化** - **提前终止**:当某轮无交换时终止排序[^3] ```csharp if (!swapped) break; ``` - **减少内循环次数**:每轮减少比较范围 ```csharp for (int j = 0; j < array.Length - i - 1; j++) ``` 4. **委托实现灵活比较** 支持自定义排序逻辑(升序/降序/复杂规则): ```csharp BubbleSort(words, (a, b) => b.CompareTo(a)); // 降序 ``` ### 性能特征 - **时间复杂度**:$O(n^2)$(最坏和平均情况),$O(n)$(最优情况,已排序时) - **空间复杂度**:$O(1)$(原地排序) - **稳定性**:稳定排序(相等元素不交换) ### 适用场景 1. 小数据集排序 2. 需要稳定排序的场景 3. 教学目的(算法原理演示) 4. 已基本有序的数据集 ### 输出示例 ``` 按年龄排序: Bob (25) Charlie (28) Alice (30) 数字排序: 1 2 5 8 9 字符串降序: pear banana apple orange ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值