排序<2>插入排序

 

1.什么是插入排序

插入排序就是从一个乱序的待排序列中一次拿一个元素,从拿到的第二个元素开始,和现已拿出的元素从后往前(或从前往后)比较,指定比前面(后面)元素大(小),就找到了他的位置,在相应的位置放入拿出的这个元素。依次类推。

2.插入排序的关键点

插入排序可以不需要额外的空间就可以完成,因为当从待排序列中拿出一个元素时,它所在的位置就空了出来,用这个空位就可以用来挪位。举个例子,有待排序列如9 2 1 8,需求是按递增顺序排序。开始第一个元素不用动,从第二个元素开始,把2拿出来,2的位置空闲了,和9进行比较发现比9小,那么就把9交换到空位上,9的位置就空了出来,再就把2放在9的位置,序列现在是这样的:2 9 1 8。现在要拿的元素是1了,从它前一个位置依次往后比较,先和9比较发现比9小,9放到1的位置。再用1和2比较,发现还是比2小,就把2放到现在空出的先前放9的那个位置上,再往前没有元素了,那么这个位置就是1 的位置,序列现在是这样的:1 2 9 8。从刚才的分析中可以看出,插入排序是一个逐渐有序的过程,也就是说直到拿出最后一个元素后才可以完成排序,不存在到中间某个位置就已经有序了排序结束的情况。

3.插入排序应用

typedef int ElmentType;
void InsertionSort(ElmentType *S, int N)
{
    int i,j;
    for(i = 1; i<N;i++)
    {
        ElmentType tmp = S[i];
        for(j = i;j >0 && tmp < S[j-1]; j--)
                S[j] = S[j-1];
        S[j] = tmp;
    }
}

 

在 Java 中,`LinkedHashSet` 是一个有序的集合,它根据插入顺序保存元素。然而,它并不支持直接排序,因为其设计目的是保持插入顺序。若希望对 `LinkedHashSet<Date>` 类型的数据按时间升序排序,则需要借助 `List` 接口的实现类(如 `ArrayList`)来完成排序操作。 以下是实现对 `LinkedHashSet<Date>` 排序的具体方法: ### 排序步骤 1. 将 `LinkedHashSet<Date>` 转换为 `List<Date>`,因为 `List` 支持排序操作。 2. 使用 `Collections.sort()` 方法对列表进行排序。由于 `Date` 类实现了 `Comparable` 接口,可以直接使用默认排序方法。 ### 代码示例 ```java import java.text.SimpleDateFormat; import java.util.*; public class Main { public static void main(String[] args) throws Exception { // 创建 LinkedHashSet<Date> 集合 LinkedHashSet<Date> allMonitorTime = new LinkedHashSet<>(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); allMonitorTime.add(sdf.parse("2023-10-05")); allMonitorTime.add(sdf.parse("2023-10-01")); allMonitorTime.add(sdf.parse("2023-10-03")); // 将 LinkedHashSet 转换为 List List<Date> sortedList = new ArrayList<>(allMonitorTime); // 对 List 进行排序 Collections.sort(sortedList); // 输出排序后的结果 for (Date date : sortedList) { System.out.println(sdf.format(date)); } } } ``` ### 输出结果 ``` 2023-10-01 2023-10-03 2023-10-05 ``` ### 注意事项 - 排序后的数据不再保持原有的插入顺序,而是按照时间升序排列。 - 如果需要再次使用排序后的数据作为有序集合,可以将排序后的 `List` 转换为新的 `LinkedHashSet`,但需注意这将重新插入元素,排序顺序会成为新的插入顺序[^1]。 ### 转换为新的 LinkedHashSet 示例 ```java // 将排序后的 List 转换为新的 LinkedHashSet LinkedHashSet<Date> newSet = new LinkedHashSet<>(sortedList); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值