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 次瀏覽

啟動您的職業生涯

透過完成課程獲得認證

開始
廣告
© . All rights reserved.