📜  Python中的排序算法

📅  最后修改于: 2022-05-13 01:57:53.600000             🧑  作者: Mango

Python中的排序算法

排序被定义为按一定顺序排列数据。排序技术用于按升序或降序排列数据(主要是数字)。它是一种用于以更易于理解的格式表示数据的方法。它是计算机科学的一个重要领域。如果我们用于对数据进行排序的方法效率低下,那么对大量数据进行排序可能会占用大量计算资源。该算法的效率与其遍历的项目数成正比。对于少量的数据,复杂的排序方法可能比它的价值更麻烦。另一方面,对于更大量的数据,我们希望尽可能提高效率和速度。我们现在将讨论几种排序技术并比较它们的时间复杂度。

一些现实生活中的排序示例是:

  • 电话簿:这是一本按字母顺序包含人们的电话号码和地址的书。
  • 字典:它是一个巨大的单词集合以及按字母顺序排列的含义。
  • 联系人列表:是手机上按字母顺序排列的联系人号码列表。

在讨论用于对提供给我们的数据进行排序的不同算法之前,我们应该考虑可用于分析排序过程的操作。首先,我们需要比较值以查看哪个更小,哪个更大,以便可以将它们排序成一个顺序,有必要有一种有组织的方式来比较值以查看它们是否按顺序排列。

不同类型的订单是:

  • 递增顺序当每个连续元素大于其前一个元素时,一组值被称为递增顺序。例如:1、2、3、4、5。这里,给定的序列是按升序排列的。
  • 递减顺序:当连续元素总是小于前一个元素时,一组值被称为递增顺序。例如:5、4、3、2、1。这里给定的序列是降序的。
  • 非递增顺序:如果序列中存在的每个第 i元素都大于或等于其第 (i-1)元素,则称一组值处于非递增顺序。只要有重复的数字,就会出现此顺序。例如:1、2、2、3、4、5。这里 2 重复了两次。
  • 非递减顺序:如果序列中存在的每个第 i元素都小于或等于其第 (i-1)元素,则称一组值处于非递减顺序。只要有重复的数字,就会出现此顺序。例如:5、4、3、2、2、1。这里 2 重复了两次。

排序技术

Python中排序技术的不同实现是:

  • 冒泡排序
  • 选择排序
  • 插入排序

冒泡排序

冒泡排序是一种简单的排序算法。这种排序算法反复比较两个相邻元素,如果它们的顺序错误,则交换它们。它也被称为下沉排序。它在平均和最坏情况下的时间复杂度为 O(n 2 ),在最佳情况下的时间复杂度为 O(n)。冒泡排序可以可视化为一个队列,人们通过相互交换来排列自己,以便他们都可以按照身高升序排列。或者换句话说,我们比较两个相邻的元素,看看它们的顺序是否错误,如果顺序错误,我们交换它们。 (即 arr[i] > arr[j] for 1 <= i < j <= s;其中 s 是数组的大小,如果数组按升序排列,反之亦然)。

例子

这里我们使用冒泡排序对以下序列进行排序

序列:2、23、10、1

第一次迭代

( 2, 23 , 10, 1) -> ( 2, 23 , 10, 1),这里比较前两个元素并保持不变,因为它们已经按升序排列。

(2, 23, 10 , 1) -> (2, 10, 23 , 1),这里第 2 和第 3 个元素按照升序进行比较和交换(10 小于 23)。

(2, 10, 23, 1 ) -> (2, 10, 1, 23 ), 这里第3和第4个元素按照升序进行比较和交换(1小于23)

在第一次迭代结束时,最大的元素位于正确排序的最右边。

第二次迭代

( 2, 10 , 1, 23) -> ( 2, 10, 1, 23), 这里再次比较前 2 个元素并保持不变,因为它们已经按升序排列。

(2, 10, 1 , 23) -> (2, 1, 10 , 23),这里第 2 和第 3 个元素按升序进行比较和交换(1 小于 10)。

在第二次迭代结束时,第二大元素位于最大元素的相邻位置。

第三次迭代

( 2, 1 , 10, 23) -> ( 1, 2 , 10, 23), 这里前2个元素按照升序进行比较和交换。

其余元素已经在第一次和第二次迭代中排序。在三次迭代之后,给定的数组按升序排序。所以最终的结果是 1, 2, 10, 23。

冒泡排序的实现:

Python3
# Python3 program for Bubble Sort Algorithm Implementation
def bubbleSort(arr):
     
    n = len(arr)
 
    # For loop to traverse through all
    # element in an array
    for i in range(n):
        for j in range(0, n - i - 1):
             
            # Range of the array is from 0 to n-i-1
            # Swap the elements if the element found
            #is greater than the adjacent element
            if arr[j] > arr[j + 1]:
                arr[j], arr[j + 1] = arr[j + 1], arr[j]
                 
# Driver code
 
# Example to test the above code
arr = [ 2, 1, 10, 23 ]
 
bubbleSort(arr)
 
print("Sorted array is:")
for i in range(len(arr)):
    print("%d" % arr[i])


Python3
# Selection Sort algorithm in Python
def selectionSort(array, size):
     
    for s in range(size):
        min_idx = s
         
        for i in range(s + 1, size):
             
            # For sorting in descending order
            # for minimum element in each loop
            if array[i] < array[min_idx]:
                min_idx = i
 
        # Arranging min at the correct position
        (array[s], array[min_idx]) = (array[min_idx], array[s])
 
# Driver code
data = [ 7, 2, 1, 6 ]
size = len(data)
selectionSort(data, size)
 
print('Sorted Array in Ascending Order is :')
print(data)


Python3
# Creating a function for insertion sort algorithm
def insertion_sort(list1): 
   
        # Outer loop to traverse on len(list1) 
        for i in range(1, len(list1)): 
   
            a = list1[i] 
   
            # Move elements of list1[0 to i-1],
            # which are greater to one position
            # ahead of their current position 
            j = i - 1 
           
            while j >= 0 and a < list1[j]: 
                list1[j + 1] = list1[j] 
                j -= 1 
                 
            list1[j + 1] = a 
             
        return list1 
            
# Driver code
list1 = [ 7, 2, 1, 6 ] 
print("The unsorted list is:", list1) 
print("The sorted new list is:", insertion_sort(list1))


输出:

选择排序

这种排序技术反复找到最小元素并按顺序对其进行排序。冒泡排序不占用任何额外的内存空间。在该算法的执行过程中,维护了两个子数组,一个已经排序的子数组,一个未排序的剩余子数组。在每次迭代执行选择排序期间,未排序子数组的最小元素排列在已排序子数组中。选择排序是一种比冒泡排序更有效的算法。在平均、最差和最好的情况下,排序的时间复杂度为 O(n 2 )。

例子

这里我们使用选择排序对以下序列进行排序

顺序:7、2、1、6

(7, 2 , 1 , 6) –> ( 1 , 7, 2, 6),在第一次遍历中,它找到最小元素(即 1)并将其放置在第一个位置。

(1, 7, 2 , 6) -> (1, 2 , 7, 6),在第二次遍历中,它找到第二个最小元素(即 2)并将其放置在第二个位置。

(1, 2 , 7, 6 ) -> (1, 2, 6, 7 ),在第三次遍历中,它找到下一个最小元素(即 6)并将其放置在第 3 个位置。

经过上述迭代,最终的数组是有序的,即1、2、6、7。

选择排序的实现

Python3

# Selection Sort algorithm in Python
def selectionSort(array, size):
     
    for s in range(size):
        min_idx = s
         
        for i in range(s + 1, size):
             
            # For sorting in descending order
            # for minimum element in each loop
            if array[i] < array[min_idx]:
                min_idx = i
 
        # Arranging min at the correct position
        (array[s], array[min_idx]) = (array[min_idx], array[s])
 
# Driver code
data = [ 7, 2, 1, 6 ]
size = len(data)
selectionSort(data, size)
 
print('Sorted Array in Ascending Order is :')
print(data)

输出:

插入排序

此排序算法维护一个始终排序的子数组。来自数组未排序部分的值被放置在已排序部分的正确位置。它在实践中比选择排序或冒泡排序等其他算法更有效。插入排序在平均和最坏情况下的时间复杂度为 O(n 2 ),在最佳情况下为 O(n)。

例子

这里我们使用插入排序对以下序列进行排序

顺序:7、2、1、6

( 7, 2 , 1, 6) -> ( 2, 7 , 1, 6), 在第一次迭代中,比较前 2 个元素,这里 2 小于 7 所以在 7 之前插入 2。

(2, 7, 1 , 6) -> (2, 1, 7 , 6),在第二次迭代中比较第 2 和第 3 个元素,这里 1 小于 7,所以在 7 之前插入 1。

( 2, 1 , 7, 6) -> ( 1, 2 , 7, 6), 在第二次迭代之后 (1, 7) 元素不是按升序排列的,所以首先排列这两个元素。因此,在 2 之前插入 1。

(1, 2, 7, 6 ) -> (1, 2, 6, 7 ),在此迭代期间,在交换所有先前元素之后,比较和交换最后两个元素。

插入排序的实现

Python3

# Creating a function for insertion sort algorithm
def insertion_sort(list1): 
   
        # Outer loop to traverse on len(list1) 
        for i in range(1, len(list1)): 
   
            a = list1[i] 
   
            # Move elements of list1[0 to i-1],
            # which are greater to one position
            # ahead of their current position 
            j = i - 1 
           
            while j >= 0 and a < list1[j]: 
                list1[j + 1] = list1[j] 
                j -= 1 
                 
            list1[j + 1] = a 
             
        return list1 
            
# Driver code
list1 = [ 7, 2, 1, 6 ] 
print("The unsorted list is:", list1) 
print("The sorted new list is:", insertion_sort(list1))

输出: