我试图在Java中实现一种高效的排序算法。出于这个原因,我还实现了快速排序,并使用了以下代码:
public class Sorting {
private static Random prng;
private static Random getPrng() {
if (prng == null) {
prng = new Random();
}
return prng;
}
public static void sort(int[] array) {
sortInte
我对数据结构和算法很陌生。我刚刚实现了一个插入排序算法。我只想确定我的代码是否正常。
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] test = {40, 1, 5, 0, 9};
for (int i = 0; i < test.length; i++) {
for (int j = i - 1; j >= 0; j--) {
if (t
如果数组长度小于某个阈值,Java6在Arrays.java中的合并排序实现将使用插入排序。这个值被硬编码为7。由于算法是递归的,对于大型数组,这种情况最终会发生很多次。规范的并不这样做,只是一直使用merge-sort,直到列表中只有1个元素。
这是一种优化吗?如果是这样,它应该有什么帮助呢?为什么是7?插入排序(甚至是<=7排序)大大增加了对大型数组进行排序所需的比较次数-因此会增加compareTo()调用速度较慢的排序的开销。
(对于不同的INSERTIONSORT_THRESHOLD值,x轴为size of array,y轴为# of comparisons )
我正在尝试理解3向基数快速排序,我不明白为什么那里有截断变量?那插入的方法呢?
public class Quick3string {
private static final int CUTOFF = 15; // cutoff to insertion sort
// sort the array a[] of strings
public static void sort(String[] a) {
// StdRandom.shuffle(a);
sort(a, 0, a.length-1, 0);
as
我正在尝试用Java语言编写一个版本的timSort,它使用array.length < 10之后的插入,否则使用合并排序。假设我对insertionSort和merge的调用是正确的,是什么使下面的代码不会命中插入、排序和正确的timSorting? /**
* timSort is a generic sorting method that sorts an array of Comparable data
* using the TimSort algorithm. Make sure this method is public so that we can
* test
一个人声称他们可以通过以下参数来改进InsertionSort。在InsertionSort的最内部循环中,不要循环遍历已经排序的数组中的所有条目,以插入被观察到的j‘to元素,只需执行BinarySearch,以便将j’to元素夹在列表A1、.、j−1中的正确位置上。这个人声称,在最坏的情况下,它们的插入排序与合并一样好。对还是错?为什么?从下面圈出一个正确答案:
a. True:在这个版本中,while循环将迭代log(n),但是在列表左侧的每个这样的迭代元素中,必须移动以允许键向下传播到中间元素,因此在最坏的情况下,这种转移仍然需要log(n)。总之,在这种情况下,插入排序将显著改进,以
我正在测量排序所需的步骤数,无论出于什么原因,气泡排序似乎总是比插入排序要快一些,从我所读到的情况来看,应该是相反的。
不打算发布我的完整代码,但我相信问题可能在于我的计数在哪里。
气泡排序:
public void sort()
{
for (out = nElems-1 ; out >= 1 ; out--)
{
count = count+1;
for (in = 0 ; in < out ; in++)
{
if ((a.get(in)) > (a.get(in+1)))
我使用与heapify算法相同的逻辑实现了一个排序算法。然而,我不相信这是堆排序。它的逻辑是,我将数组的两部分(最初将是一个双向链表,但如果不创建自己的类,java不允许我这样做)与它旁边的部分进行比较。如果它更大,则交换。很像冒泡排序。但是,当交换完成时,我会对第二个元素进行反向冒泡排序,以保持数组的顺序。 我不能完全确定最坏情况下的时间复杂度,但我认为它是O(n^2)。它的时间复杂度是多少,而且它最像的排序算法是什么? import java.util.Arrays;
/**
* firstNum and secondNum trade places.
* Whenever a s
对于CS作业,我将在java中创建大小越来越大的随机数组,并在一个图上绘制它们的运行时。但是,当使用相同的输入运行时,插入、合并和快速排序的实现似乎具有相同的运行时间。我已经用不同的方式实现了很多次,并且仍然得到了相同的结果。这是我的代码:
import java.util.*; import java.util.Random;
public class Complexity {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input= new Sca
我正在构建一个混合排序,为此,我需要一个快速和自适应的排序理想的小规模(< 65个元素)。
插入排序立即浮现在脑海中,我一直在修补不同的实现。我的要求是按照C++标准接受迭代器。
线性插入排序
template <typename Iter>
void lin_sort(Iter begin, Iter end) {
for (auto cur = begin; cur != end; ++cur) {
auto key = *cur;
auto ins = cur - 1;
for (; begin <= ins
插入排序算法的以下Java实现出现在Noel Markham公开的Java编程访谈的第28页:
public static List<Integer> insertSort(final List<Integer> numbers) {
final List<Integer> sortedList = new LinkedList<>();
originalList: for (Integer number : numbers) {
for (int i = 0; i < sortedList.size();
我在插入排序时遇到了一些问题,从结构中传入数据。返回错误:|98|无法在赋值中将'store‘转换为'int’。
struct store{
char tag[5];
int cost;
long int volume;
};
void costSort(store storedEntries[], int count);
void volumeSort(store storedEntries[], int count);
int main(){
store record[100];
ifstream fin;
char
我刚刚写了下面的代码,我不确定它是否是Java中插入排序的正确实现(它看起来与冒泡排序太相似了,我不敢肯定)。 public static void insertionsort (int[] arr){
int temp;
for (int i = 0; i<arr.length; i++){
for (int j = i+1; j>=0; j--){
if (arr[j]<arr[j-1]){
temp = arr[j];
基本上,我正在尝试用Java编写一个算法来确定数组中乱序的对的数量。所以如果我们取i和j,并且j在数组中的位置比i更高,但是Ai > Aj,那么它把这两个数算作反转。目前,我所拥有的是:
for(int i = 0; i<n-1; i++){
if (A[i] > A[i+1]){
k++;
我知道如何做这样的事情,但我希望运行时是(n+k),其中n是数组的长度,k是数组中的反转次数。
编辑:这是我实现插入排序的尝试:
int k = 0;
int [] A = {5, 4, 3, 2, 1};
int n = A.length;
for(int i
我很难找到一个好答案。出于某种原因,我认为STL排序应该使用交换来实现,以更好地支持复杂的类型,但是当我最后对代码进行了一点深入研究时,它看起来实际上是在执行二进制副本。有人能确认一下吗?我想二进制拷贝实际上是首选的交换。
附带问题:是否有任何STL算法或容器操作使用交换来实现?(显然是在std::swap之外。)我想知道什么时候为复杂的类型实现我自己的交换是谨慎的。
编辑:我问的原因是你是否有这样的东西:
class MyClass {
vector<int> vec_data;
int a;
int b;
}
vector<MyClass> my_vec
通过理解插入排序算法,我编写了这段代码。我的老师说它是冒泡排序,但我的朋友说它是插入的。有没有人可以检查一下并向我简要介绍一下。
#include <stdio.h>
void sort(int n) {
int i, j;
float arr[n], k;
for (i = 0; i <= n - 1; i++) {
printf("Enter the number");
scanf("%f", &arr[i]);
}
for (i = 1; i <= n - 1; i++) {
j