常见排序问题

常见排序问题

1、手写快排的代码,并说明其最优情况
def quicksort(arr, low, high):
    if low < high:
        pivot_index = partition(arr, low, high)
        quicksort(arr, low, pivot_index - 1)
        quicksort(arr, pivot_index + 1, high)

def partition(arr, low, high):
    pivot = arr[high]
    i = low - 1
    for j in range(low, high):
        if arr[j] <= pivot:
            i += 1
            arr[i], arr[j] = arr[j], arr[i]
    arr[i + 1], arr[high] = arr[high], arr[i + 1]
    return i + 1

快速排序的最优情况是每次都能够选择一个近似中值的元素作为枢轴(pivot),使得划分后的两个子序列尽可能平衡。这样可以保证每次划分都将当前序列的规模缩小到大致为原来的一半,时间复杂度为 O(logn)。在最优情况下,快速排序的时间复杂度为 O(nlogn)。

2、请问求第k大的数的方法以及各自的复杂度是怎样的,另外追问一下,当有相同元素时,还可以使用什么不同的方法求第k大的元素。

快速排序的最优情况是每次都能够选择一个近似中值的元素作为枢轴(pivot),使得划分后的两个子序列尽可能平衡。这样可以保证每次划分都将当前序列的规模缩小到大致为原来的一半,时间复杂度为 O(logn)。在最优情况下,快速排序的时间复杂度为 O(nlogn)。

3、请你来介绍一下各种排序算法及时间复杂度
  1. 冒泡排序(Bubble Sort):O(n^2)
  2. 选择排序(Selection Sort):O(n^2)
  3. 插入排序(Insertion Sort):O(n^2)
  4. 希尔排序(Shell Sort):O(nlogn)
  5. 归并排序(Merge Sort):O(nlogn)
  6. 快速排序(Quick Sort):O(nlogn)
  7. 堆排序(Heap Sort):O(nlogn)
  8. 计数排序(Counting Sort):O(n+k)
  9. 桶排序(Bucket Sort):O(n+k)
  10. 基数排序(Radix Sort):O(d*(n+k)),其中d为待排序元素的位数,k为基数
4、请问海量数据如何去取最大的k个

快速排序的最优情况是每次都能够选择一个近似中值的元素作为枢轴(pivot),使得划分后的两个子序列尽可能平衡。这样可以保证每次划分都将当前序列的规模缩小到大致为原来的一半,时间复杂度为 O(logn)。在最优情况下,快速排序的时间复杂度为 O(nlogn)。

5、介绍一下,归并排序的原理是什么?

快速排序的最优情况是每次都能够选择一个近似中值的元素作为枢轴(pivot),使得划分后的两个子序列尽可能平衡。这样可以保证每次划分都将当前序列的规模缩小到大致为原来的一半,时间复杂度为 O(logn)。在最优情况下,快速排序的时间复杂度为 O(nlogn)。

6、谈一谈,如何得到一个数据流中的中位数?

在一个数据流中获取中位数可以采用以下方法:

  • 保持数据有序:每次有新的数据到来时,将其插入有序序列的合适位置,用二分查找来找到插入位置,然后计算中位数。时间复杂度为O(logn),适用于数据流量比较小的情况。
  • 使用两个堆:维护一个最大堆和一个最小堆,最大堆存放数据流中较小的一半数,最小堆存放数据流中较大的一半数。插入一个新数时,根据大小关系放入对应的堆,并保持两个堆的大小差距不超过1,即最大堆与最小堆的大小之差不超过1。取中位数时,如果两个堆大小相等,则取两个堆顶元素的平均值;否则,取较多元素的堆顶元素作为中位数。时间复杂度为O(logn),适用于数据流量比较大的情况。
7、对一千万个整数排序,整数范围在[-1000,1000]间,用什么排序最快?

对于一千万个整数,整数范围在[-1000, 1000]之间,可以使用计数排序(Counting Sort)来实现最快的排序。由于整数范围较小且已知,我们可以创建一个长度为2001的计数数组,然后统计每个整数出现的次数,最后按照计数数组的顺序输出排好序的整数。计数排序的时间复杂度为O(n+k),其中n为待排序序列长度,k为范围大小。在这种情况下,k的值比较小,因此计数排序可以快速完成排序任务。

8、堆排序的思想

堆排序的思想是通过构建二叉堆来实现排序。具体步骤如下:

  • 将待排序序列构建成一个大顶堆(或小顶堆);
  • 依次将堆顶元素与最后一个元素交换,然后重新调整堆结构,再重复该过程直到整个序列有序。

堆排序的时间复杂度为O(nlogn),具有稳定的排序性能。

9、topK给出3种解法
  1. 堆排序的思想是通过构建二叉堆来实现排序。具体步骤如下:
  2. 将待排序序列构建成一个大顶堆(或小顶堆);
  3. 依次将堆顶元素与最后一个元素交换,然后重新调整堆结构,再重复该过程直到整个序列有序。

堆排序的时间复杂度为O(nlogn),具有稳定的排序性能。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值