当前位置: 首页 > 面试题库 >

现场用collabedit写代码,一个怪异的归并算法。。。之前没遇到过,直接把归并写出来,但是说复杂度太高,优化了三遍还不行,最后说出用小顶堆解决了。。。

高德水
2023-03-14
本文向大家介绍现场用collabedit写代码,一个怪异的归并算法。。。之前没遇到过,直接把归并写出来,但是说复杂度太高,优化了三遍还不行,最后说出用小顶堆解决了。。。相关面试题,主要包含被问及现场用collabedit写代码,一个怪异的归并算法。。。之前没遇到过,直接把归并写出来,但是说复杂度太高,优化了三遍还不行,最后说出用小顶堆解决了。。。时的应答技巧和注意事项,需要的朋友参考一下

参考回答:

归并算法:

#include using namespace std;
//将有二个有序数列a[first...mid]和a[mid...last]合并。
void __merge(int a[], int first, int mid, int last, int temp[])
{
int i = first, j = mid + 1;
int m = mid, n = last;
int k = 0;
while (i <= m && j <= n)
{
	if (a[i] <= a[j])
		temp[k++] = a[i++];
	else
		temp[k++] = a[j++];
}
while (i <= m)
temp[k++] = a[i++];
while (j <= n)
temp[k++] = a[j++];
for (i = 0; i < k; i++)
	a[first + i] = temp[i];
}
void __merge_sort(int a[], int first, int last, int temp[])
{
    if (first < last)
    {
        int mid = (first + last) / 2;
        __merge_sort(a, first, mid, temp);
        __merge_sort(a, mid + 1, last, temp);
        __merge(a, first, mid, last, temp);
    }
}
bool MergeSort(int a[], int n)
{
    int *p = new int[n];
    if (p == NULL)
    {
    	return false;
    }
    else
    {
    	__merge_sort(a, 0, n - 1, p);
    	delete[] p;
    	return true;
    }
}
int main()
{
    const int LEN = 10;
    int a[LEN] = { 23, 40, 45, 19, 12, 16, 90, 39, 87, 71 };
    cout<<"Before the merge sort, the Array is:"<<endl;
    for(int i = 0; i < LEN; ++i)
    {
    	cout<<a[i]<<" ";
    }
    cout<<endl;
    cout<<endl;
    MergeSort(a, LEN);
    cout<<"After the merge sort, the Array is:"<<endl;
    for(int i = 0; i < LEN; ++i)
    {
    	cout<<a[i]<<" ";
    }
    cout<<endl;
    system("pause");
    return 0;
}

小顶堆:

import java.util.Arrays;
public class SmallHeap {
    public static int[] topN(int[] arr, int n) {
    int[] list = new int[n];
    System.arraycopy(arr, 0, list, 0, n);
    for (int i = 0; i < n; i++) {
    	int t = i; while (t != 0 && list[parent(t)] > list[t]) {
    	swap(list, t, t = parent(t));
    }}
    for (int i = n, len = arr.length; i < len; i++) {
    if (arr[i] >= list[0]) {
    // 置换栈顶
    list[0] = arr[i];
    // 调整栈顶
    int t = 0;
    while((left(t)<n&&list[t]>list[left(t)])||(right(t)<n&& list[t]>list[right(t)])) {
    if (right(t) < n && list[right(t)] < list[left(t)]) {
    swap(list, t, t = right(t));
    } else {
    swap(list, t, t = left(t));
    }
    }
    }
    }
    return list;
    }
    private static void swap(int[] list, int i, int j) {
    int tmp = list[i];
    list[i] = list[j];
    list[j] = tmp;
    }
    private static int parent(int i) {
    return (i - 1) / 2;
    }
    private static int left(int i) {
    return 2 * i + 1;
    }
    private static int right(int i) {
    return 2 * i + 2;
    }
    public static void main(String[] args) {
        int[] arr = new int[]{56, 30, 71, 18, 29, 93, 44, 75, 20, 65, 68, 34};
        System.out.println("原始数组: ");
        System.out.println(Arrays.toString(arr));
        System.out.println("调整后数组: ");
        System.out.println(Arrays.toString(SmallHeap.topN(arr, 5)));
    }
}

 

 

 类似资料:
  • 本文向大家介绍请你说一说快速排序,并手写代码相关面试题,主要包含被问及请你说一说快速排序,并手写代码时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 1、快速排序的基本思想: 快速排序使用分治的思想,通过一趟排序将待排序列分割成两部分,其中一部分记录的关键字均比另一部分记录的关键字小。之后分别对这两部分记录继续进行排序,以达到整个序列有序的目的。 2、快速排序的三个步骤: (1)选择基准:在

  • Dijkstra算法的这种特殊实现的时间复杂度是多少? 我知道这个问题的几个答案是,当你使用最小堆时,O(E log V),这篇文章和这篇文章也是如此。然而,这里的文章说的是O(V ElogE),它的逻辑与下面的代码类似(但不完全相同)。 算法的不同实现可以改变时间复杂度,我试图分析下面实现的复杂性,但是像检查和忽略中的重复顶点这样的优化让我怀疑自己。 以下是伪代码: 笔记: 从源顶点可到达的每个

  • 我正处于学习Java的开始阶段,并且有一个作业正在为我提供一些困难(我假设实际上并不困难)。 说明如下: “在一个名为MathCompations的类中,编写一个名为findMin的方法,该方法接受三个整数作为参数并返回三个值中最小的一个。例如,调用findMin(1,10,-1)将返回-1。您必须使用Math类min函数(它只接受2个参数)。在类中编写一个主方法,调用findMin(5,7,3)

  • 下面是我的代码: 输出:输出:显示最小数字0

  • 本文向大家介绍写一个方法实现“交换排序算法”,并解释下时间复杂度和空间复杂度相关面试题,主要包含被问及写一个方法实现“交换排序算法”,并解释下时间复杂度和空间复杂度时的应答技巧和注意事项,需要的朋友参考一下