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