GVKun编程网logo

将MergeSort与插入排序相结合以使其更高效(函数merge用于将两个顺序)

21

本文将介绍将MergeSort与插入排序相结合以使其更高效的详细情况,特别是关于函数merge用于将两个顺序的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及

本文将介绍将MergeSort与插入排序相结合以使其更高效的详细情况,特别是关于函数merge用于将两个顺序的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于2、直接插入排序InsertSort、AI如何扩展数据分析并使其更高效、C语言 插入排序 Insert Sort、insertion sort(插入排序)的知识。

本文目录一览:

将MergeSort与插入排序相结合以使其更高效(函数merge用于将两个顺序)

将MergeSort与插入排序相结合以使其更高效(函数merge用于将两个顺序)

所以我有一个MergeSort算法,我想将MergeSort与插入排序结合使用以减少合并的开销,问题是如何?我想使用插入排序对细分进行排序,然后合并。

 public class mergesorttest{    public static void main(String[]args){        int d[]= {10,2,3,4,5,6,5,4,3,5,6,7,1};        mergeSort(d,0,d.length);        for(int x:d) System.out.print(x+" ");         System.out.println();     }static void mergeSort(int f[],int lb, int ub){    //termination reached when a segment of size 1 reached -lb+1=ub    if(lb+1<ub){        int mid = (lb+ub)/2;        mergeSort(f,lb,mid);        mergeSort(f,mid,ub);        merge(f,lb,mid,ub);    }}static void merge (int f[],int p, int q, int r){    //p<=q<=r    int i =p; int j = q;     //use temp array to store merged sub-sequence    int temp[] = new int[r-p]; int t = 0;     while(i<q && j<r){        if(f[i]<=f[j]){            temp[t] =f[i];             i++;t++;        }        else{            temp[t] = f[j];            j++;            t++;        }        //tag on remaining sequence        while(i<q){            temp[t] = f[i];            i++;            t++;        }        while(j<r){            temp[t]=f[j];            j++;            t++;        }        //copy temp back to f        i=p;t=0;        while(t<temp.length){            f[i]=temp[t];            i++;            t++;        }        }}}

public static void insertion_srt(int array[], int n, int b){  for (int i = 1; i < n; i++){  int j = i;  int B = array[i];  while ((j > 0) && (array[j-1] > B)){  array[j] = array[j-1];  j--;  }  array[j] = B;  }  }

答案1

小编典典

合并会自动对元素进行排序。但是,当列表低于某个阈值时,可以使用插入排序进行排序:

static final int THRESHOLD = 10;static void mergeSort(int f[],int lb, int ub){    if (ub - lb <= THRESHOLD)        insertionSort(f, lb, ub);    else    {        int mid = (lb+ub)/2;        mergeSort(f,lb,mid);        mergeSort(f,mid,ub);        merge(f,lb,mid,ub);    }}

进行除此以外的任何操作(除了稍微超出阈值)会 增加 合并排序所花费的时间。

尽管合并排序为O(n log n),插入排序为O(n
2),但是插入排序具有更好的常量,因此在非常小的数组上速度更快。这,这,这和这是我发现的一些相关问题。

2、直接插入排序InsertSort

2、直接插入排序InsertSort

1、实现代码

public class InsertSort {

  /**
   * 
   * @param arr
   *          要排序的数组
   * @return 排序后的数组
   */
  public static Integer[] sort(Integer[] arr) {
    return sort(arr, 0, arr.length - 1);
  }

  /**
   * 对arr[left,right]使用插入排序
   * 
   * @param arr
   * @param left
   * @param right
   * @return
   */
  public static Integer[] sort(Integer[] arr, int left, int right) {
    for (int i = left + 1; i <= right; i++) {
      // 临界条件
      for (int j = i; j > left && arr[j] < arr[j - 1]; j--) {
        SortHelper.swap(arr, j, j - 1);
      }
    }
    return arr;
  }
}

这里的临界条件是arr[j] < arr[j-1],因为我们说插入排序是往有序数组中插入,因为arr[0, j-1]是已经排好序的,当arr[j]比arr[j-1]还要大时,那此刻j的位置就是arr[j]所在的位置,也即此时无须移动和交换arr[j]的位置。

2、时间效率

假设待排序的元素个数为n,则向有序数组中逐个插入元素的操作进行了n-1次,每次操作分为比较和移动操作,而 比较的次数和移动的次数取决于待排序的初始数组。

(1)在最好的情况下:即待排序的数组已经是有序的,每次只需1次比较0次移动。此时:总比较次数为n-1次,总移动次数为0次。

(2)在最坏的情况下:即待排序的数组是逆序的,这是在第 j 次操作中,为插入元素需要同前面的 j 个元素进行 j 次关键字比较,移动元素的次数为 j+1 次。此时:总比较次数为 n(n-1)/2 ,总移动次数为 (n+2)(n-1)/2 次。

(3)平均情况下:即在第 j 趟操作中,插入记录大约需要同前面的 j/2 个元素进行关键字比较,移动记录的次数为 j/2+1次。此时:总比较次数 ≈ n^2 /4 次,总移动次数 ≈ n^2 /4 次 。

3、单元测试

  /**
   * 测试直接插入排序
   */
  @Test
  public void testInsertSort() {
    int n = 10;
    Integer[] arr = SortHelper.generateRandomArray(n, 0, 50);
    SortHelper.printArr("排序前数组:", arr);
    SortHelper.testSort(InsertSort.class.getName(), "sort", arr, true);
    
    // 排序前数组:
    // 39,0,44,17,39,43,1,12,8,21
    // 排序后数组:
    // 0,1,8,12,17,21,39,39,43,44
  }
  /**
   * 测试直接插入排序
   */
  @Test
  public void testInsertSort() {
    int n = 20000;
    Integer[] arr = SortHelper.generateRandomArray(n, 0, 100000);// 几乎无序
    Integer[] arr1 = SortHelper.generateNearlyOrderedArray(n, 100);// 近乎有序
    Integer[] arr2 = SortHelper.generateRandomArray(n, 0, 10);// 存在大量重复数据

    SortHelper.testSort(InsertSort.class.getName(), "sort", arr);
    SortHelper.testSort(InsertSort.class.getName(), "sort", arr1);
    SortHelper.testSort(InsertSort.class.getName(), "sort", arr2);

    // InsertSort->sort用时: 560ms
    // InsertSort->sort用时: 9ms
    // InsertSort->sort用时: 366ms

    // 性能优劣:arr1->arr2->arr
  }

可以看出当一个数组近乎有序时,它的排序时间远远的快于其它两种情况。

4、选择排序和插入排序的比较

  /**
   * 测试选择排序、直接插入排序
   */
  @Test
  public void testSISort() {
    int n = 20000;
    Integer[] arr = SortHelper.generateRandomArray(n, 0, 100000);// 几乎无序
    Integer[] arr1 = SortHelper.generateNearlyOrderedArray(n, 100);// 近乎有序
    Integer[] arr2 = SortHelper.generateRandomArray(n, 0, 10);// 存在大量重复数据

    Integer[] insertSortArr = Arrays.copyOf(arr, arr.length);
    Integer[] insertSortArr1 = Arrays.copyOf(arr1, arr.length);
    Integer[] insertSortArr2 = Arrays.copyOf(arr2, arr.length);

    System.out.println("选择排序:");
    SortHelper.testSort(SelectionSort.class.getName(), "sort", arr);
    SortHelper.testSort(SelectionSort.class.getName(), "sort", arr1);
    SortHelper.testSort(SelectionSort.class.getName(), "sort", arr2);
    System.out.println("直接插入排序:");
    SortHelper.testSort(InsertSort.class.getName(), "sort", insertSortArr);
    SortHelper.testSort(InsertSort.class.getName(), "sort", insertSortArr1);
    SortHelper.testSort(InsertSort.class.getName(), "sort", insertSortArr2);

    // 选择排序:
    // SelectionSort->sort用时: 333ms
    // SelectionSort->sort用时: 299ms
    // SelectionSort->sort用时: 244ms
    // 直接插入排序:
    // InsertSort->sort用时: 542ms
    // InsertSort->sort用时: 7ms
    // InsertSort->sort用时: 358ms
  }

(1)对于近乎有序的情况,直接插入排序的时间效率远远大于选择排序,这是因为当后一个元素比前一个元素还要大的时候,直接插入排序直接过掉进入下一个元素的排序;而选择排序仍然需要进行遍历去查找剩余的最小元素位置。

(2)对于几乎无序和存在大量重复数据的情况,选择排序的时间效率高于直接插入排序。

5、直接插入排序的优化

我们说直接插入排序是将第i个元素插入到前i-1个有序数组的合适位置。那么既然是在有序数组中确定插入位置,则可以不断二分有序数组来确定插入位置,即搜索插入位置的方法可以使用折半查找实现而不是逐个比较得到,我们称这种排序为“折半插入排序”。具体实现……待续。

AI如何扩展数据分析并使其更高效

AI如何扩展数据分析并使其更高效

AI如何扩展数据分析并使其更高效

在当今数据驱动的世界里,ai正在重塑整个行业。ai加速了大规模数据分析,提高了准确性,并迅速提供了可操作的见解-为企业释放了巨大的价值。通过自动化各种分析任务和简化分析生命周期,ai将错误降至最低,释放人力资源用于战略工作,并削减运营成本。在ai和数据之间的这种共生关系中,企业为扩展分析和推动数据驱动的决策找到了一个强大的支持力量。

了解分析生命周期

分析生命周期由六个阶段组成,让我们用简单的术语逐一分析它们:

  • 发现阶段:在此阶段,我们首先定义业务目标,收集必要的信息,选择适当的分析方法,并明确工作范围。
  • 数据理解阶段:在这里,我们根据数据需求和可用性收集初始数据。我们通过研究数据并了解其特征来结束这一阶段。
  • 数据准备阶段:我们从多个来源收集数据,并对其进行清理、混合和格式化,以使其可用于分析。
  • 探索性分析和建模阶段:在此阶段,我们开发我们的方法,确定重要变量,构建模型,并评估其性能。
  • 验证阶段:这一阶段是关于评估结果、审查流程并根据调查结果确定下一步。
  • 可视化和展示阶段:这些阶段主要是有效地传达结果,它们包括根据分析确定呈现洞察力的最佳方法,了解受众,汇编故事,并提出建议。

AI如何在整个生命周期内增强分析

AI是在整个生命周期内扩展分析的强大工具,它可以学习模式,适应给定的参数,并执行人类可能无法有效完成的任务。以下是AI可以在分析过程的每个阶段增强任务并使其自动化的四种关键方式:

自动化数据文档

需要最多时间和体力的任务经常被剥夺,数据文档就是典型的例子之一。借助人工智能技术,我们可以创建表文档,因为它可以识别数据类型,找到数据集之间可能的关系,并生成列描述。此外,它还可以生成各种编程语言的自然语言描述和代码片段摘要,这有助于开发人员更有效地理解和记录他们的代码。准备好文档可以避免我们的返工,并避免混淆

AI系统还可以阅读和理解这些文档中的文本,以快速准确地提取相关信息。基于AI的文档处理可以帮助企业保持遵守行业法规。通过自动审查和分析文档,企业可以快速识别任何需要在严重问题之前解决的不合规或风险领域,例如识别出于合规原因需要更新的过时合同。

自动代码查询

在进行分析时,我们常常需要花费很多时间来理解和开发代码,以及其用途。但是我们可以利用人工智能来配置和扩展自动查询,从而根据具体需求来查找信息

一系列AI辅助的数据应用程序和Query Explainer可以读取一条SQL语句,并立即编写关于该查询的用途和使用方式的简单描述。有了查询优化器,AI可以输入查询并生成建议改进的列表,它可以自动识别可以优化查询的区域,例如建议索引和联接类型以及修复SQL查询等任务。

编写查询可能需要更多的专业知识和时间,但AI可以被设计为理解复杂的问题、生成代码并快速解决问题。AI可以将使用普通英语语句的SQL查询转换为SQL代码,它还将SQL语法转换为数据库可以理解的简明逻辑语句,并建议数据库表可以回答的问题。

数据探索和理解

探索性数据分析是更好地理解数据集和基础数据的重要且耗时的初始步骤之一,然而,当我们查看包含多列和多行的大型数据时,更容易弄清楚我们正在查看的是什么,而当我们不确定表中隐藏了什么类型的信息时,就会变得更加复杂。

大部分情况下,数据都是杂乱无章的。它通常由各种人员、流程和应用程序创建、处理和存储。因此,数据集可能缺少某些字段,可能包含手动输入错误,或者可能存在重复的数据,甚至可能使用不同的名称来描述同一个事物。人类通常能够在自己的数据中识别和纠正这些问题,但是用于训练机器学习或深度学习算法的数据则需要进行自动预处理

人工智能可以简洁地解释表格内容,认出模式和趋势,并记录数据中的相似和不同之处。它可以学习常见的人为错误模式,同时检测和解决信息中的潜在缺陷。此外,它还可用于自动执行和加快数据准备任务,包括数据建模和数据探索

AI可以根据数据和目标提供明智的建议、建议和见解,从而帮助增强数据探索,它还可以帮助生成数据的自然语言查询、摘要和解释,使其更易于交互和解释。

数据可视化和故事讲述

数据可视化和创建仪表板对于更好地理解数据和交流见解至关重要,由于数据准备、分析、叙述等原因,这个多步骤的过程可能需要数天时间。

AI可以通过检测数据中的模式和趋势来增强故事讲述和分析,从而产生重大影响,它可以通过检测和纠正数据质量问题来自动化和改进该过程。有了AI支持的数据可视化,企业可以将他们的数据转化为资产,揭示出以前可能没有注意到的见解,例如,它可以揭示客户行为的模式,帮助企业更有效地定制其营销战略。

此外,实时可视化能够帮助企业快速应对变化,提高运营效率,增强反应能力。人工智能还可以提供背景和解释,创造随着数据变化实时演变的动态故事。它可以通过生成自然语言摘要、注释和解释来解读数据,从而使数据更易于访问和更具价值,为企业和决策者打开新的可能性

AI与数据的共生关系

人工智能是一种强大的增强分析工具,但如果没有数据,它就无法发挥作用。没有人工智能,数据管理也是不可能的。人工智能和数据管理相辅相成,共同形成一种共生关系,这对充分发挥数据分析潜力至关重要

AI正在给分析带来革命性的变化,使其更高效、更准确、更易于企业访问,最终帮助他们做出更好的数据驱动决策。从自动化文档到简化的查询、数据探索和动态数据可视化,AI是数据分析领域的强大支持力量。随着各行业继续利用AI的力量,我们可以预期看到更多的创新应用程序和该领域的进一步进步

以上就是AI如何扩展数据分析并使其更高效的详细内容,更多请关注php中文网其它相关文章!

C语言 插入排序 Insert Sort

C语言 插入排序 Insert Sort

#include <stdio.h>

void exchange(int* array, int p1, int p2)
{
	if (p1 == p2)
		return;
	int temp = array[p1];
	array[p1] = array[p2];
	array[p2] = temp;
}

void insertSort(int* array, int len)
{
	int sorted = 0; //the 1st data we think was already sorted
	int cur;
	for (cur = 1; cur < len; cur++)//start from 2nd data
	{
		//loop with sorted range
		int sort;
		for (sort = 0; sort <= sorted; sort++)
		{
			if (array[cur] <= array[sort])
			{
				// let current data move forward one by one and stop at right postion
				int curPos = cur;
				while (curPos != sort)
				{
					exchange(array, curPos, curPos - 1);
					curPos--;
				}
				break;
			}
		}
		sorted++;
	}
}

//From Intruduction Of Alogrithim
void insertSort1(int* array, int len)
{
	for (int i = 1; i < len; i++)//loop start from 2nd data cause we think 1st is already sorted
	{
		int key = array[i];//current data we call it key
		int j = i - 1;//watch pre data of key
		while (j >= 0 && array[j] > key)
		{
			array[j+1] = array[j];//if pre data bigger, move to right
			j--;//if pre data stiill bigger than key, move to right
		}//end while for moving
		array[j + 1] = key;// when move over the postion `j+1` was empty insert the key
	}	
}

void main()
{
	intarray[10] = { 1, 8, 3, 6, 2, 4, 7, 5, 9, 0 };
	printf("before:");
	int i;
	for (i = 0; i <= sizeof(array) - 1; i++)
	{
		printf("%d ", array[i]);
	}
	printf("\n");
	insertSort(array, sizeof(array));
	printf("\n after:");
	for (i = 0; i <= sizeof(array) - 1; i++)
	{
		printf("%d ", array[i]);
	}
	return;
}

 

insertion sort(插入排序)

insertion sort(插入排序)

function insertionSort (arr) {
  let len = arr.length;
  let j = 0, tmp = 0;

  for (let i = 1; i < len; i++) {
    j = i;
    tmp = arr[i];

    while (j > 0 && arr[j-1] > tmp) {
      arr[j] = arr[j-1];
      j--;
    }

    arr[j] = tmp;
  }
}

今天关于将MergeSort与插入排序相结合以使其更高效函数merge用于将两个顺序的讲解已经结束,谢谢您的阅读,如果想了解更多关于2、直接插入排序InsertSort、AI如何扩展数据分析并使其更高效、C语言 插入排序 Insert Sort、insertion sort(插入排序)的相关知识,请在本站搜索。

本文标签: