zoukankan      html  css  js  c++  java
  • 排序算法

    原理:

    1 4    = 1
    2 1 +1 = 2
    3 2 +1 = 3
    4 3 +1 = 4
    5 5    = 5
    
    prev: null
    next: 1
    newOrder 1 < originOrder 4
    >0 && < 4
    
    
    1 2 -1 = 1
    2 3 -1 = 2
    3 1    = 3
    4 4    = 4
    5 5    = 5
    
    prev: 3
    next: 4
    newOrder 3 > originOrder 1
    >1 && <4
    
    
    1 1    = 1
    2 3 -1 = 2
    3 4 -1 = 3
    4 5 -1 = 4
    5 2    = 5
    
    prev: 5
    next: null
    newOrder 5 > originOrder 2
    >2 && <6
    
    
    newOrder > originOrder,中间部分序号-1
    newOrder < originOrder,中间部分序号+1

    伪代码:

    private async Task SortAsync(Guid id, int? toPreviousOrder, int? toNextOrder)
    {
        var newOrder = GetNewOrder(toPreviousOrder, toNextOrder);
        var entity = await _store.FindAsync(id, required: true);
        if (entity.Order == newOrder)
            return;
    
        IEnumerable<Entity> entitiesBetween;
        if (newOrder > entity.Order)
        {
            entitiesBetween = await GetEntitiesAsync(x => x.Order > entity.Order && x.Order < newOrder + 1);
        }
        else
        {
            entitiesBetween = await GetEntitiesAsync(x => x.Order > newOrder - 1 && x.Order < entity.Order);
        }
    
        if (entitiesBetween.Any())
        {
            foreach (var entityBetween in entitiesBetween)
            {
                if (newOrder > entity.Order)
                {
                    entityBetween.Order -= 1;
                }
                else
                {
                    entityBetween.Order += 1;
                }
                
                entityBetween.WhenUpdated = DateTime.Now;
            }
            _store.UpdateRange(entitiesBetween);
        }
    
        entity.Order = newOrder;
        entity.WhenUpdated = DateTime.Now;
        _store.Update(entity);
    
        await _store.SaveChangesAsync();
    }
    
    private int GetNewOrder(int? toPreviousOrder, int? toNextOrder)
    {
        if (toPreviousOrder.HasValue && toNextOrder.HasValue)
        {
            return toPreviousId.Value;
        }
        else if (toPreviousOrder.HasValue && !toNextOrder.HasValue)
        {
            return toPreviousOrder.Value;
        }
        else if (!toPreviousOrder.HasValue && toNextOrder.HasValue)
        {
            return toNextOrder.Value;
        }
        else throw new InvalidOperationException();
    }

    纠正代码(调用 GetNewOrderId 的地方需要改成调用这个):

            public static Guid GetNewOrderId(Guid? toPreviousId, Guid? toNextId, int? toPreviousOrder, int currentOrder)
            {
                if (toPreviousId.HasValue && toNextId.HasValue)
                {
                    if (toPreviousOrder < currentOrder)
                    {
                        return toNextId.Value;
                    }
                    else
                    {
                        return toPreviousId.Value;
                    }
                }
                else if (toPreviousId.HasValue && !toNextId.HasValue)
                {
                    return toPreviousId.Value;
                }
                else if (!toPreviousId.HasValue && toNextId.HasValue)
                {
                    return toNextId.Value;
                }
                else throw new InvalidOperationException();
            }
  • 相关阅读:
    MySQL命名、设计及使用规范--------来自标点符的《MySQL命名、设计及使用规范》
    Mybatis 在 insert 之后想获取自增的主键 id
    MyBatis动态SQL foreach标签实现批量插入
    PowerDesigner设置表字段唯一约束
    Hadoop基本介绍
    oracle的行级触发器使用
    RFID-RC522、FM1702SL、M1卡初探
    PHP处理海量样本相似度聚类算法
    RFID(Radio Frequency Identification 射频识别)基本概念
    USB Keyboard Recorder
  • 原文地址:https://www.cnblogs.com/myesn/p/sorting-algorithm.html
Copyright © 2011-2022 走看看