排序伪代码总结

目录

一.选择排序

算法

二.插入排序

算法

三.快速排序(分治法)

split算法

quicksort算法

四.归并排序

算法

合并两个有序的表



一.选择排序

时间复杂度为Θ(n²)

算法

输入:n个元素的数组A[1...n]

输出:按非降序排列的数组A[1...n]

  1. for  i←1 to n-1
  2.        k←i       //设立标志位
  3.        for j←i+1 to n     //查找第i小的元素
  4.             if A[j]<A[k]    then k←j
  5.        end for
  6.        if k≠i    then 交换A[i]与A[k]
  7. end for

操作方法:首先找到最小元素,将其存放在A[1]中,然后找到剩下的n-1个元素中的最小元素,将其存放在A[2]中,重复此过程直至找到第二大的元素,并将其存放在A[n-1]中

二.插入排序

算法

输入:n个元素的数组A[1...n]

输出:按非降序排列的数组A[1...n]

  1. for i←2 to n
  2.      x←A[i]
  3.      j←i-1
  4.      while(j>0) and (A[j]>x)
  5.               A[j+1]←A[j]
  6.               j←j-1
  7.      end while
  8.      A[j+1]←x
  9. end for

操作方法:在第i次插入中,要将A[i]插入到已排序的子数组A[1...n-1]中的合适位置上,依次扫描序号从i-1到1的元素,每次都将A[i]和当前位置的元素比较,在扫描的每一步,元素A[1...i-1]大于A[i]都被移到序号更高的一个位置上,然后在合适的位置上插入A[i]

三.快速排序(分治法)

时间复杂度为Θ(n*logn)空间复杂度为Θ(n)

输入:数组A[]low...high]

输出:(1)如有必要,输出按上述描述的重新排列的数组A

          (2)划分元素A[low]的新位置w

split算法

  1. i←low
  2. x←A[low]     //第一位的元素
  3. for j←low+1 to high    //遍历数组中剩下所有元素
  4.      if A[j]≤x    then
  5.         i←i+1   //用i指针来从第二个元素开始交换添加较小的元素
  6.         if i≠j    then 互换A[i]和A[j]
  7.      end if 
  8. end for
  9. 互换A[low]和A[i]
  10. w←i
  11. return A和w

 操作方法:用i指针和j指针交换元素,当算法对所有元素扫描后,用A[i]与主元交换,这样所有小于或等于主元的元素处于它的左边,并且所有大于主元的元素处于它的右边,最后算法将i赋给主元的位置w

quicksort算法

输入:n个元素的数组A[1...n]

输出:按非降序排列的数组A[1...n]

quicksort(A,low,high)

  1. if low<high    then
  2.     SPLIT(A[low...high],w)    //w为A[low]的新位置
  3.     quicksort(A,low,w-1)
  4.     quicksort(A,w+1,high)
  5. end if

操作方法:子数组A[low...w-1]和A[w+1,high)递归地排序

四.归并排序(分治法)

时间复杂度为Θ(n*logn)空间复杂度为Θ(n)

算法

输入:n个元素的数组A[1...n]

输出:按非降序排列的数组A[1...n]

mergesort(A,1,n)

过程:mergesort(low,high)

  1. if low<high    then
  2.    mid←⌊(low+high)/2⌋
  3.    mergesort(A,low,mid)
  4.    mergesort(A,mid+1,high)
  5.    MERGE(A,low,mid,high)
  6. end if

合并两个有序的表

输入:数组A[1...m]和它的三个索引p,q,r,1≤p≤q≤r≤m,两个子数组A[p...q]和A[q+1...r]各自按升序排列

输出:合并两个子数组A[p...q]和A[q+1...r]的数组A[p...r]

MERGE

  1. //B[p...r]是个辅助数组
  2. s←p;t←q+1;k←p
  3. while s≤q and t≤r
  4.          if A[s]≤A[t]    then
  5.             B[k]←A[s]
  6.             s←s+1
  7.          else
  8.             B[k]←A[t]
  9.             t←t+1
  10.          end if
  11.          k←k+1
  12. end while
  13. if s=q+1    then B[k...r]←A[t...r]
  14. else B[k...r]←A[s...q]
  15. end if
  16. A[p...r]←B[p...r]

末尾挂一波我看到的极好讲算法导论的文章https://blog.csdn.net/summer070825/article/details/52627229

猜你喜欢

转载自blog.csdn.net/qq_36912408/article/details/82181389