C++数组中交叉线的计数


给定一个包含不同元素的未排序数组。目标是在数组排序后找到交叉线。交叉线的计数如下所示:

  • Arr[]={ 1,2,4,3,5 } 如图所示,共有3条交叉线。

  • Arr[]= { 1,2,3,4,5 }。因为数组已排序,所以没有交叉线。

我们将使用插入排序来计算交叉线,其中从右边取一个元素添加到其左边的已排序元素中。每次元素添加到已排序部分时,都将计数器递增,因为它移动到其正确的位置。它将通过穿过所有大于它的元素来进行。

让我们通过例子来理解。

输入 − arr[]= {4,3,1,2 }

输出− 数组中交叉线的数量 − 5

解释 − 4-4 和 3-3 交叉 1-1 和 2-2。共有 4 条交叉线。

4-4 和 3-3 互相交叉一次。共有 4+1=5 条交叉线。

输入 − arr[]= { 0,1,5,3 }

输出 − 数组中交叉线的数量 − 1

解释 − 5-5 和 3-3 互相交叉一次。共有 1 条交叉线。

下面程序中使用的算法如下:

  • 我们使用一个用不同数字初始化的整数数组 arr[]。

  • 函数 insertionSort(int arr[], int n) 以数组及其长度作为输入,排序后返回交叉线的数量作为结果。

  • 将交叉线的初始数量设为 0。使用计数变量。

  • 第一个元素已经排序,所以从第二个元素到结尾 (i=1 到 i<n),取每个元素作为 item。(item=arr[i]) 并令 j=i-1。

  • 如果元素 > item 且 j>0,则将所有元素向右移动。对于每次移动,计数器递增,因为这些元素都被 item 交叉。

  • 在 while 循环结束时,将 item 放置到其正确的位置,即 arr[j+1]。

  • 对所有元素执行此操作,并计算它们交叉的元素数。

  • 将计数器值递增为可能的交叉线数。

示例

 在线演示

#include <bits/stdc++.h>
using namespace std;
int insertionSort(int arr[], int n){
   int count=0;
   int item;
   int j;
   for (int i = 1; i < n; i++){
      item = arr[i];
      j = i - 1;
      //insert element at correct position in sorted part, no. of elements it passes
      //from right till correct position is count of cross lines.
      while (j >= 0 && arr[j] > item){
         arr[j + 1] = arr[j];
         j = j - 1;
         count++;
      }
      arr[j + 1] = item;
   }
   return count;
}
int main(){
   int arr[] = { 4,5,3,1,2};
   int n = 5;
   cout<<"Number of cross lines: "<<insertionSort(arr, n);
   return 0;
}

输出

如果我们运行上面的代码,它将生成以下输出:

Number of cross lines: 8

更新于:2020年8月29日

163 次浏览

启动您的职业生涯

通过完成课程获得认证

开始
广告