📌  相关文章
📜  按升序对给定的IP地址进行排序

📅  最后修改于: 2021-04-22 04:00:11             🧑  作者: Mango

给定IP地址数组arr [] ,其中每个元素都是一个IPv4地址,任务是按给定的IP地址升序排序。

例子:

方法:想法是使用自定义比较器对给定的IP地址进行排序。由于IPv4有4个八位位组,我们将逐个八位位组比较地址八位位组。

  • 检查IP地址的第一个八位字节,如果第一个地址的第一个八位字节更大,则返回True以交换IP地址,否则返回False。
  • 如果IP地址的第一个八位位组相同,则比较两个IP地址的第二个八位位组。如果第一个地址具有更大的第二个八位位组,则返回True以交换IP地址,否则返回False。
  • 如果IP地址的第二个八位位组也相同,则比较两个IP地址的第三个八位位组。如果第一个地址的第三个八位字节更大,则返回True交换IP地址,否则返回False。
  • 如果IP地址的第三个八位字节也相同,则比较两个IP地址的第四个八位字节。如果第一个地址的第三个八位字节更大,则返回True交换IP地址,否则返回False。
  • 如果第四个八位位组也相同,则两个IP地址相等。然后还返回False。

下面是上述方法的实现:

Python
# Python implementation to sort
# the array of the IP Address
  
from functools import cmp_to_key
  
# Custom Comparator to sort the
# Array in the increasing order
def customComparator(a, b):
      
    # Breaking into the octets 
    octetsA = a.strip().split(".")
    octetsB = b.strip().split(".")
      
    # Condition if the IP Address
    # is same then return 0
    if octetsA == octetsB:
        return 0
    elif octetsA[0] > octetsB[0]:
        return 1
    elif octetsA[0] < octetsB[0]:
        return -1
    elif octetsA[1] > octetsB[1]:
        return 1
    elif octetsA[1] < octetsB[1]:
        return -1
    elif octetsA[2] > octetsB[2]:
        return 1
    elif octetsA[2] < octetsB[2]:
        return -1
    elif octetsA[3] > octetsB[3]:
        return 1
    elif octetsA[3] < octetsB[3]:
        return -1
  
# Function to sort the IP Addresses
def sortIPAdddress(arr):
      
    # Sort the Array using 
    # Custom Comparator
    arr = sorted(arr, key = \
       cmp_to_key(customComparator))
         
    print(*arr)
    return arr
      
# Driver Code
if __name__ == "__main__":
    arr = ['192.168.0.1', 
           '192.168.1.210', 
           '192.168.0.227']
      
    # Function Call
    sortIPAdddress(arr)


输出:
192.168.0.1 
192.168.0.227 
192.168.1.210

时间复杂度: O(N * logN)