python学习笔记:算法之排序(sorting)

一、选择排序(selection sort)

>>核心思想repeatedly select largest or smallest remaining element and swap it into sorted position.(重复选出剩余元素中的最大值(降序)或最小值(升序))

  • 时间复杂度: O ( N 2 ) O(N^2)

  • 第一步, 共计进行 N N 次比较和交换( N 1 N-1 次比较+ 1 1 次交换)。

  • 第二步,共计进行 N 1 N-1 次比较和交换( N 2 N-2 次比较+ 1 1 次交换),因为此时经过第一步的操作已经排序了 1 1 个元素。

  • 第三,共计进行 N 2 N-2

  • 因此:所有操作步骤为: 1 + 2 + . . . + ( N 1 ) + N = N ( N + 1 ) / 2 = O ( N 2 ) 1+2+...+(N-1)+N=N(N+1)/2=O(N^2)
    selection sort

二、冒泡排序(bubble sort)

>>核心思想: repeatedly compare and swap ( if necesarily) two elements. (循环遍历输入列表进行两两比较,依次获得最大/小值)

  • 时间复杂度: O ( N 2 ) O(N^2)

  • 第一步,共计进行 N 1 N-1 次比较和 N 1 N-1 次交换(最坏情况下)。

  • 第二步,共计进行 N 2 N-2 次比较和 N 2 N-2 次交换(最坏情况下)。

  • 因此,所有操作步骤为: 1 2 + 2 2 + . . . + ( N 2 ) 2 + ( N 1 ) 2 = N ( N 1 ) = O ( N 2 ) 1*2+2*2+...+(N-2)*2+(N-1)*2=N(N-1)=O(N^2)
    bubble sort

三、归并排序(merge sort)

>>核心思想:分治法sort blocks of 1’s into 2’s, 2’s into 4’s, etc, on each pass merging sorted blocks into sorted larger blocks.(将输入列表分为长度1为的n个子序列,循环进行两两合并排序)
>>Note: This is the theoretical best-possible Big-O for comparison-based sorting! (理论上,归并排序是时间复杂度最优的基于比较策略的排序算法)

  • 时间复杂度: O ( N l o g N ) O(NlogN)

  • 第一步,将 N N 个元素看作 N N 个子序列,将 N N 个子序列两两合并并排序,长度为 2 2 N / 2 N/2 个子序列均得到了排序。

  • 第二步,将 N / 2 N/2 个子序列两两合并并排序,长度为 2 2 2^2 N / 2 2 N/2^2 个子序列得到了排序。

  • k k 步,将2个子序列合并排序,即长度为 2 k = N 2^k=N 的序列得到了排序。

    显然, k = l o g 2 N k=log_2N ,每一步需进行复杂度为 O ( N ) O(N) 的比较和拷贝等操作, k O ( N ) = O ( N l o g N ) k*O(N)=O(NlogN) 。这里, l o g N l o g 2 N logN表示log_2N
    merge-sort
    注:https://blog.csdn.net/xiaozhimonica/article/details/89470129

猜你喜欢

转载自blog.csdn.net/xiaozhimonica/article/details/89509540