面试Java中的基本排序算法

(ps:排序算法是基本功,因此笔试/面试很容易被考到,这里只对排序算法进行基本阐述,没有书写代码,相关代码百度百科)
稳定性:稳定排序算法会让原本相等的键值的记录维持相对次序。也就是说如果一个排序算法是稳定的,当有两个相等的键值记录R与S,且在原本的列表中R出现在S之前,在排序过的列表中R也将会在S之前。
不稳定排序:

排序名称 排序的平均时间复杂度
选择排序(selection sort) O(n^2)
快速排序(quick sort) O(nlogn)
希尔排序(shell sort) 根据步长序列的不同而不同
堆排序(heap sort) O(nlogn)
基数排序(radix sort) O(k* n)(k决定了进行多少轮处理,n是每轮处理的位数)

稳定的排序:

排序名称 排序的平均时间复杂度
插入排序(insertion sort) O(n^2)
冒泡排序(bubble sort) O(n^2)
归并排序(merge sort) O(nlogn)
二叉树排序(binary tree sort) O(nlogn)
计数排序(counting sort) O(n+k)(当输入的元素是n个0~k之间的整数)
桶排序(bucket sort) O(n+k)
  1. 选择排序(Selection sort):
    核心思想:首先在未排序的序列中找到最大(小)的一个元素,存放在排序序列的起始位置,然后,再从剩下未排序的元素中找到最大(小)元素,放到排序序列的结束位置,以此类推,直到所有元素均排列完成。核心思想是首先在未排序的序列中找到最大(小)的一个元素,存放在排序序列的起始位置,然后,再从剩下未排序的元素中找到最大(小)元素,放到排序序列的结束位置,以此类推,直到所有元素均排列完成。
    优点:与数据移动有关,每完成一次循环就会有一个元素位于正确的位置,如果位于正确位置则不参加数据交换。
    数据结构:数组。
    最坏时间复杂度:O(n^2)
    最优时间复杂度:O(n^2)
    平均时间复杂度:O(n^2)
    最坏空间复杂度:О(n) total, O(1) auxiliary

  2. 快速排序(Quicksort):
    核心思想:采用分治思想,首先从数列中挑出一个元素,作为基准(pivot),然后将大于基准的元素放在前边(后边),小于基准的元素放在后边(前边),递归地(迭代)把小于基准值的子数列和大于基准值的子数列排序,直到数列大小为0或1的时候已经排好序了。
    数据结构:不定
    最坏时间复杂度:O(n^2)
    最优时间复杂度:O(nlogn)
    平均时间复杂度:O(nlogn)
    最坏空间复杂度:根据实现的方式不同而不同。

  3. 归并排序(Merge sort):
    核心思想:就是将两个已经排序的序列合并成一个序列的操作,有递归法,迭代法。递归法是申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列;设定两个指针,最初位置分别为两个已经排序序列的起始位置;比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置;以此类推直到某一指针到达序列尾;将另一序列剩下的所有元素直接复制到合并序列尾。迭代法是将序列每相邻两个数字进行归并操作,形成 ceil(n/2)个序列,排序后每个序列包含两/一个元素;若此时序列数不是1个则将上述序列再次归并,形成 ceil(n/4)个序列,每个序列包含四/三个元素,依次类推,直到所有元素排序完毕,即序列数为1。
    数据结构:数组
    最坏时间复杂度:O(nlogn)
    最优时间复杂度:O(nlogn)
    平均时间复杂度:O(nlogn)
    最坏空间复杂度:O(n)

  4. 插入排序(Insertion sort):
    核心思想:从第一个元素开始,该元素可以认为已经被排序,取出下一个元素,在已经排序的元素中从后向前扫描,如果已经排好序的元素大于新元素,则将该元素移到下一个位置,以此类推,直到找到已排序的元素小于或者等于新元素的位置,将该元素插入该位置后,重复上述步骤,直到没有元素可取。
    数据结构:数组
    最坏时间复杂度:O(n^2)
    最优时间复杂度:O(n^2)
    平均时间复杂度:O(n^2)
    最坏空间复杂度:一共O(n),需要辅助空间O(1)

  5. 希尔排序(shell sort):
    核心思想:通过将比较的全部元素分为几个区域来提升插入排序的性能,首先设定一个初始步长,根据排序数列按步长分组,对每一列进行插入排序,缩减步长,再次插入排序,最后以1步长进行排序
    数据结构:数组
    最坏时间复杂度:根据步长序列不同而不同
    最优时间复杂度:O(n)
    平均时间复杂度:根据步长序列不同而不同
    最坏空间复杂度:O(n)

  6. 堆排序(heapsort):
    核心思想:是指利用堆的数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子节点的键值或索引总是小于或大于他的父节点,堆中最大值总是位于根节点。堆排序就是取出位于第一个数据的根节点,并做最大堆调整(将堆的末端子节点作调整,使得子节点永远小于父节点)的递归运算。
    数据结构:
    最坏时间复杂度:O(nlogn)
    最优时间复杂度:O(nlogn)
    平均时间复杂度:O(nlogn)
    最坏空间复杂度:O(n)

  7. 基数排序(Radix sort):
    核心思想:将所有比较数值(正整数)统一为同样的数字长度,数字较短的数面前补零。从最低位开始依次进行一次排序,这样从最低位排序一直到最高位排序完成以后,数列就变成了一个有序数列
    数据结构:数组
    最坏时间复杂度:O(kn)
    最坏空间复杂度:O(k+N)

  8. 冒泡排序(Bubble sort):
    核心思想:比较相邻的元素。如果第一个比第二个大,就进行交换,对每一对相邻的元素做同样的工作,只到最后,会将最大数冒出来,以此类推,直到没有任何一对数字需要比较。
    数据结构:数组
    最坏时间复杂度:O(n^2)
    最优时间复杂度:O(n^2)
    平均时间复杂度:O(n^2)
    最坏空间复杂度:O(n)

  9. 计数排序:
    核心思想:输入的元素是n个0到K之间的整数由于用来计数的数组C的长度取决于待排序数组中的数据范围,这使得计数排序对于数据范围很大的数组,需要大量的时间和内存,首先找出待排序的数组中最大和最小的元素,然后统计数组中每个值为i的元素出现的次数,存入数组C的第i项,对所有的计数累加从数组的第一个元素开始,每一项和前一项相加,最后反向填充目标数组:将每一个i元素放在新数组的C[i]项,每放一个元素就将C[i]减去1。
    数据结构:数组
    最坏时间复杂度:O(n+k)
    最优时间复杂度:O(n+k)
    平均时间复杂度:O(n+k)
    最坏空间复杂度:O(n+k)

  10. 桶排序(Bucket sort):
    核心思想:将数组分到有限数量的桶里,每个桶再个别排序,首先设置一个定量的数组当作空桶子,寻访序列,并将项目一个一个放到对应的桶子去。对每个不是空的桶子进行排序。从不是空的桶子里把项目再放回原来的序列中也就是将所有桶的排序结果合并起来。要求数据的长度必须完全一样
    数据结构:数组
    最坏时间复杂度:O(n^2)
    最优时间复杂度:O(n)(要排序的数组内的数值均匀分配的时候)
    平均时间复杂度:O(n+k)
    最坏空间复杂度: O(n*k)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章